を使用してユーザーのセカンダリグループリストを割り当てる場合
# usermod -G <grouplist> <user>
実行中のセッションをすべてログアウトすることなく、このグループ割り当てを強制的に有効にすることは可能ですか?
これは、Screen セッションが多くのシェルを実行している状態で存在する場合に非常に便利です
実行中のシェルでnewgrp
コマンドを使ってユーザのプライマリグループを変更できると思うのですが、セカンダリグループにも使える代替案はありますか?
理想的には、すべてのシェルで手動で実行しなくても、それぞれのシェルで効果を発揮するものが欲しいのですが、それができない場合は、Screen がそれぞれのシェルで同じコマンドを強制的に実行する方法があるかもしれません
417 Simon 2011-04-17
恐ろしくハックなのですが、特定のグループのためにnewgrp
の2つのレイヤーを使ってこれを実現することができます
id -g
…は現在のプライマリグループIDを示します。この例ではこれを orig_group
と呼びます。そして
newgrp <new group name>
…は、そのグループをプライマリとして切り替え、groups
またはid -G
で返されたグループのリストに追加します。さて、さらに
newgrp <orig_group>
…は、あなたが新しいグループを見ることができるシェルを取得し、プライマリは元のものです
これは恐ろしいもので、一度に一つのグループしか追加できませんが、X セッション全体でログアウトせずにグループを追加するのには何度か助けられました (例えば、sshfs が動作するように fuse をユーザのグループとして追加するなど)
編集 : これはパスワードを入力する必要もありません
242 Legooolas 2011-10-10
シェル内からは、以下のコマンドを発行することができます
su - $USER
id は新しいグループを一覧表示するようになりました
id
438 stivlo 2011-11-06
このリンクからのこの気の利いたトリックは素晴らしい働きをします
exec su -l $USER
私は、私がこれを行う方法を忘れてしまうたびに、これはgoogleで出てくる最初のリンクですので、私はここにそれを投稿するだろうと考えました
182 jhaagsma 2013-06-18
1.ログアウトや再ログインをせずに、新しいグループでシェルを取得する
グループを1つだけ追加する場合は、以下のように使いました
exec sg <new group name> newgrp `id -gn`
これはLegooolasの2層のnewgrpトリックのバリエーションですが、1行になっていて1次グループを手動で入力する必要がありません
sg
はnewgrpですが、新しいグループIDで実行するコマンドを受け付けています。exec
は、新しいシェルが既存のシェルを置き換えることを意味するので、二度も「ログアウト」する必要はありません
su を使うのとは違い、パスワードを入力する必要がありません。また、(グループを追加する以外の)環境を更新しないので、現在の作業ディレクトリなどを保持します
2.セッション内のすべてのスクリーンウィンドウでコマンドを実行します
Screen の at
コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく、Screen コマンドであることに注意してください)
以下のコマンドを使用して、既存のすべてのScreenセッションにコマンドを送信することができます
screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
スクリーンセッションで id
を実行させるためにはバックトリックをエスケープする必要があり、コマンドの最後に ‘Enter’ を押すためにスクリーンを取得するためには ^M が必要であることに注意してください
screen の stuff
コマンドは、単にあなたに代わってコマンドテキストを入力するだけであることにも注意してください。したがって、スクリーンウィンドウの一つがコマンドプロンプトで中途半端に書かれたコマンドを持っていたり、シェル以外のアプリケーション (例えば emacs, top) を実行していたりすると、何かおかしなことが起こるかもしれません。これが問題であれば、いくつか考えがあります
- 中途半端に書かれたコマンドを取り除くには、コマンドの先頭に”^C “を追加します
- emacsのウィンドウなどでコマンドを実行しないようにするには、`at’ にウィンドウのタイトルなどでフィルタをかけることができます(上の例では、すべてのウィンドウにマッチする “#”を使っていますが、ウィンドウのタイトルやユーザなどでフィルタをかけることもできます)
特定のウィンドウ(ウィンドウ番号で識別される)でコマンドを実行するには、次のようにします
screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
39 Patrick Conheady 2014-12-17
newgrp
コマンドを使って問題を解決しました
newgrp <GroupName>
このブログ記事に詳しい説明があります
21 Pavan Vegirouthu 2016-10-07
こんなことができるんですね
usermod -G
を使って、好きなだけグループを追加してください。そして、セッションを実行しているユーザとして、’-‘ 引数だけで newgrp -
を実行してください
これはグループIDをデフォルトに再初期化しますが、セカンダリグループも設定します。これは、現在のセッションからgroups
を実行して、usermod
とnewgrp
の前後で確認することができます
これは各オープンセッションから実行しなければなりません – 私は画面のことはよく知りません。しかし、すべてのオープンセッションを反復処理してnewgrp
を実行することができれば、問題ないでしょう。グループやグループIDを知ることを心配する必要はないでしょう
幸運を祈る
14 lunchmeat317 2012-01-30
グループは通常ログイン時に列挙されますが、ログアウトして再度ログインしなくてもグループの列挙を強制的にやり直す方法はありません
ここで投票された多くの回答は、新鮮な環境で新しいシェルを起動する(再ログインと同じ)回避策を使用しているようです。親シェルと他のすべての継続的に実行されているプログラムは、通常、クリーンなログアウトとログインの後に新鮮なシェルから再起動されるまで、一般的に新しいグループメンバーシップを受け取りません
12 Mister_Tom 2011-04-25
To summarize:
exec newgrp <newlyaddedgroupname1>
exec newgrp <newlyaddedgroupname2>
...
exec newgrp -
exec’ を使うと、既存のシェルを newgrp コマンドで起動した新しいシェルに置き換えることができます (つまり、新しいシェルから抜けるとログアウトします)
最後の newgrp -
は、通常のプライマリグループを復元するために必要です
注意: 元の投稿者の質問は、新しく追加されたグループを既存のプロセスに表示させる方法でした。gpasswd
と usermod
コマンドは既存のプロセスには影響を与えません; 新しく追加された (または削除された) グループはアカウントに表示されます (アカウントからは消えます) が、既存のプロセスのパーミッションは変更されません。 newgrp -
は /etc/group を読み直してグループリストをリセットすることはありません
4 jimav 2017-02-10
これはsudo
を持っている場合のトリックであり、場合によってはパスワードをもう一度入力する手間を省くことができます
sudo su $USER
1 kqw 2014-08-06
私も同じような問題がありましたが、ログインしていないユーザーにも問題がありました。nscd を再起動しても解決しませんでしたが、以下のコマンドを実行しても解決しました。nscd -i group
.これは nscd (キャッシングデーモン) にグループファイルをリロードするように指示しているはずです
1 Marki555 2014-11-13
newgrpコマンドが動作しませんでした。これは/etc/sudoersに依存しているのかどうかはわかりませんが、普段はsudoにパスワードを入力しなければならないのですが、これはパスワードを要求しなくても動作しました
[leo60228@leonix:~]$ groups
users wheel
[leo60228@leonix:~]$ sudo echo hi
[sudo] password for leo60228:
hi
[leo60228@leonix:~]$ sudo -k # reset sudo timeout
[leo60228@leonix:~]$ exec sudo -i -u $(whoami) # no password necessary
[leo60228@leonix:~]$ groups
users wheel docker
1 leo60228 2018-04-28
これをシェルスクリプトで行う必要がありました (スクリプトは現在のユーザをグループに追加し、そのグループのメンバシップを必要とする後のコマンドを実行します)。newgrp
コマンドは、任意のコマンドではなく新しいシェルを実行することしかできないという点で脆いです (元のコマンドライン引数で現在のシェルスクリプトを再実行したいのです)
これが私の解決策で、多くの bash-isms を使用しています: (周囲のスクリプトは、必要なグループが現在アクティブでない場合にのみこの関数を実行するための何らかのブランチが必要であることに注意してください)
(注意: スクリプトは sudo adduser $user docker
を実行したことを暗示していますが、これは docker
の代わりに sudo docker
をどこでも実行できることを意味しますが、この場合は望ましくありませんでした)
# save these for later
ORIGINAL_ARGS=("$@")
# This function is a little insane. The problem is this: user running
# this script is not a member of docker group, but used 'sudo' to add
# themselves to group. Without logging out and back in, the only way
# to gain access to that group is via the 'newgrp' command, which
# unfortunately starts a new shell rather than an arbitrary command...
#
# Also, we're going to newgrp twice: first to add the new group and
# again to restore the original group (but the new group remains in
# the 'groups' output).
#
# So this horrendous hack dups stdin to fd3 for later. Then runs
# 'newgrp' piping in a script that runs 'newgrp' a second time, piping
# in another script that restores stdin from fd3 and execs the
# original command...
restart-newgrp-newgrp() {
# dup original stdin to fd3
exec 3<&0
local group="$1"
local command="$0"
local arg
for arg in "${ORIGINAL_ARGS[@]}"; do
printf -v command "%s %q" "$command" "$arg"
done
# restore original stdin from fd3; also replace any single-quote in
# command with '"'"' to embed it in a single-quoted string
local script
printf -v script "exec newgrp %q <<<'exec <&3-; exec %s'" "$(id -gn)" "${command//\'/\'\"\'\"\'}"
exec newgrp "$group" <<<"$script"
}
0 Patrick 2019-10-21
環境変数を保存する必要がある場合は、exec sudo -E -u "$USER" "$SHELL"
を試してみてください。exec
は現在のシェルを新しいシェルに置き換え、-E
は環境変数を保存し、-u "$USER"
はユーザを自分自身に変更し、$SHELL
は使用するコマンドをシェルに指定します
0 retnikt 2020-04-25
すでに多くの正解がありますが、Debian ベースのシステムでは問題なく動作しました
sudo -s -u ${USER}
このコマンドはsudo環境での作業を行います
-s
フラグは/etc/passwdファイルで設定した通りにシェルを実行します
0 abu_bua 2020-06-18
ターミナルを再起動しても GUI アプリケーションを動作させるには、exec su -p $USER
を試してください。これは環境変数 (Xorg のものを含む) を保持しますが、グループをリロードします
または、現在のシェルを置き換える代わりにサブシェルを生成するには、exec
を削除します
0 nyanpasu64 2020-07-06
受け入れられた答えは正解ですが、対話型シェルにしか使えず、スクリプトでは動作しません。これを解決するために、私はこれを使いました
newgrp <GroupName> << END
my_command
END
これにより、更新されたグループで新しいセッションを開き、コマンドを実行すると、最初のセッションに戻ります。これにより、グループを作成して同じスクリプトで使用することができます
0 Rea Haas 2020-07-30