it-swarm-ja.com

ログアウトせずにLinuxユーザーのグループ割り当てを再ロードする

以下を使用してユーザーの2次グループリストを割り当てる場合

# usermod -G <grouplist> <user>

実行中のすべてのセッションをログアウトせずにこのグループ割り当てを強制的に有効にすることはできますか?

グループ割り当てを行うためにセッション全体を本質的に破棄する必要があるので、これは Screen セッションが多くの実行中のシェルと共に存在する状況で非常に役に立ちます。効きます。

newgrp コマンドを使用して、実行中のシェルでユーザーのプライマリグループを変更できると思います - セカンダリグループで機能する代替手段はありますか?

理想的には、各シェルで手動で実行しなくても各シェルで有効になるようなものが必要ですが、それに失敗すると、Screenに同じコマンドを強制的に実行させる何らかの方法が必要になります。

318
Simon

非常に厄介ですが、特定のグループに対してこれを実現するために2つのnewgrpname__層を使用することができます。

id -g

...現在のプライマリグループIDを教えてくれます。この例では、これをorig_groupと呼びます。その後:

newgrp <new group name>

...そのグループをプライマリとして切り替え、それをgroupsname__またはid -Gによって返されるグループのリストに追加します。今、さらに:

newgrp <orig_group>

...あなたは新しいグループを見ることができ、プライマリが元のものであるシェルを取得します。

これは恐ろしいことで、一度に1つのグループしか追加されませんが、ログアウトせずにグループを追加したり、Xセッション全体でグループを追加したりすることができましたsshfsが動作するように).

編集:これはsuname__がするようにあなたのパスワードをタイプすることもあなたに要求しません。

192
Legooolas

シェルの内側から、次のコマンドを発行できます。

su - $USER

idは新しいグループを一覧表示します。

id
338
stivlo

このリンクからのこの気の利いたトリックは素晴らしい作品です!

exec su -l $USER

やり方を忘れるたびにここに投稿することにしましたが、これがGoogleで最初に登場したリンクです。

147
jhaagsma

1.ログアウトして再度ログインしないで新しいグループでシェルを取得する

グループを1つだけ追加する場合は、次のようにしました。

exec sg <new group name> newgrp `id -gn`

これはLegooolasの2層のnewgrpトリックのバリエーションですが、それは一列になっており、手動でプライマリグループに入る必要はありません。

sgはnewgrpですが、新しいグループIDで実行するコマンドを受け付けます。 execは、新しいシェルが既存のシェルを置き換えることを意味するので、2回「ログアウト」する必要はありません。

Suとは異なり、パスワードを入力する必要はありません。 (グループを追加する以外に)あなたの環境を更新することもしないので、あなたはあなたの現在の作業ディレクトリなどを保持します。

2.セッション内のすべての画面ウィンドウでコマンドを実行する

Screenの at コマンドは、指定したウィンドウでコマンドを実行します(これは、ShellコマンドではなくScreenコマンドです)。

次のコマンドを使用して、既存のすべてのScreenセッションにコマンドを送信できます。

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

Screenセッションでidを実行させるにはバッククォートをエスケープし、Screenをコマンドの最後で 'enter'を押すようにするには^ Mを使用する必要があります。

Screenの stuff コマンドは単にあなたに代わってコマンドテキストをタイプすることにも注意してください。したがって、画面ウィンドウの1つがコマンドプロンプトで半書かれたコマンドを持っているか、シェル以外のアプリケーション(emacs、topなど)を実行している場合、奇妙なことが起こるかもしれません。これが問題になる場合は、いくつか考えがあります。

  • 半書きのコマンドを削除するには、コマンドの先頭に "^ C"を追加します。
  • Emacsウィンドウなどでコマンドを実行しないようにするには、ウィンドウタイトルなどをフィルタリングするように `at 'に依頼します(上記の例では、すべてのウィンドウに一致する"# "を使用しますが、ウィンドウタイトルでフィルタリングできます。など)。

特定のウィンドウ(ウィンドウ番号で識別される)でコマンドを実行するには、次のようにします。

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
30

あなたはこれを行うことができます。

usermod -Gを使って必要なだけグループを追加します。次に、セッションを実行しているユーザーとして、引数 ' - 'を付けてnewgrp -を実行します。

これにより、グループIDがデフォルトに再初期化されますが、セカンダリグループも設定されます。これを確認するには、現在のセッションからgroupsusermodの前後にnewgrpを実行します。

これは開いている各セッションから実行する必要があります - 私はscreenについてはあまり知りません。しかし、開いているすべてのセッションを反復処理してnewgrpを実行することが可能であれば、それは良いことです。グループやグループIDを知っていることを心配する必要はありません。

頑張ってください。

13
lunchmeat317

newgrpコマンドを使用することで私の問題は解決しました。

newgrp <GroupName>

このブログ記事 に詳細な説明があります。

13

グループは通常ログイン時に列挙されます。ログアウトせずに再度ログインせずにグループ列挙を強制的にやり直す方法はありません。

ここで投票された多くの回答は、新鮮な環境で新しいシェルを起動する回避策を使用するようです(再度ログインするのと同じ)。親シェルおよび他のすべての継続的に実行されているプログラムは、通常、クリーンログアウトおよびログインの後で通常は新しいシェルから再起動されるまで、新しいグループメンバーシップを受け取りません。

12
Mister_Tom

要約する:

exec newgrp <newlyaddedgroupname1>
exec newgrp <newlyaddedgroupname2>
...
exec newgrp -

'exec'を使用することは、newgrpコマンドで開始された新しいシェルで既存のシェルを置き換えることを意味します(したがって、新しいシェルから出るとログアウトします)。

最後のnewgrp -は通常のプライマリグループを復元するのに必要なので、後で作成するファイルはそれをグループの所有者にします。

注意:最初の投稿者の質問は、新しく追加されたグループを既存のプロセスに表示する方法です。 gpasswdおよびusermodコマンドは既存のプロセスには影響しません。新しく追加された(または削除された)グループは、アカウント、つまり/ etc/groupファイルと/ etc/gshadowファイルに表示されます(表示されなくなります)が、既存のプロセスに対する権限は変更されません。実行中のプロセスを強制終了する必要がある権限を削除するにはnewgrp -は/ etc/groupを再読み込みしてグループリストをリセットすることはありません。代わりに、以前プロセスに関連付けられていたグループを使用するだけのようです。

4
jimav

私は同様の問題を抱えていましたが、ログインしていないユーザーのためにも。 nscdを再起動しても役に立ちませんでしたが、このコマンドを実行してもnscd -i groupとなりました。これはnscd(キャッシングデーモン)にgroupsファイルをリロードするように指示します。

1
Marki555

Newgrpコマンドが機能しませんでした。これが/ etc/sudoersに依存しているかどうかはわかりませんが、通常はSudoのパスワードを入力する必要があります。これは、パスワードを要求せずに機能しました。

[[email protected]:~]$ groups
users wheel

[[email protected]:~]$ Sudo echo hi
[Sudo] password for leo60228:
hi

[[email protected]:~]$ Sudo -k # reset Sudo timeout

[[email protected]:~]$ exec Sudo -i -u $(whoami) # no password necessary

[[email protected]:~]$ groups
users wheel docker
0
snuggles08

あなたがSudoを持っているなら、これはトリックをします、そして、それはあなたのパスワードをもう一度入力することからあなたを救うことができる場合があります:

Sudo su $USER
0
guaka