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


348

次を使用してユーザーのセカンダリグループリストを割り当てる場合:

# usermod -G <grouplist> <user>

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

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

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

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


少なくとも一部のウィンドウ/セッションマネージャーでは、セッションが新しいグループを選択し、メニュー、パネルボタンなどから開始される新しいプロセスで使用できるようにすることができます。私はここに来て、もう一度それを見つけようとしているので、今どうやってそれを行うかを言うことはできません。それはおそらくウィンドウマネージャーに固有のものです。
mc0e

回答:


205

恐ろしくハックですがnewgrp、特定のグループに対して2つのレイヤーを使用してこれを実現できます。

id -g

...現在のプライマリグループIDが表示されます。orig_groupこの例の目的のためにこれを呼び出します。次に:

newgrp <new group name>

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

newgrp <orig_group>

...新しいグループが表示され、プライマリが元のグループであるシェルが表示されます。

これは恐ろしく、一度に1つのグループしか追加できませんが、ログアウトせずにXセッション全体でグループを追加するのに数回役立ちました(たとえば、ヒューズをグループとしてユーザーに追加するには) sshfsが機能するように)。

編集:パスワードを入力する必要もありませんsu


6
ナイストリック、私はそれが好き
サイモン

1
Fedora newgrp $USERでは、の代わりに行う必要がありましたnewgrp <orig_group>。つまり、元のプライマリグループIDを見つける必要がなかったので、このソリューションよりも簡単です。
リチャードターナー14年

2
私はそれで十分であることがわかりましたnewgrp <new group name>。これはUbuntu 14.04
エドワードフォーク

4
@EdwardFalk正しい、しかしあなたはあなたのプライマリーとしてそのグループを去りたくない(そうではない)
...-mimoralea

4
それぞれnewgrpが新しいシェルを作成するため、セッションを完全に終了する必要がある場合は、「exit exit exit」を実行して完全に終了する必要があります(:
-jwd

371

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

su - $USER

idは新しいグループをリストします:

id

3
私はこれが多くの場合最良のアプローチだと思いますが、元のポスターはスクリーンセッション内で複数のシェルを更新したかったのです。この解決策は、各シェルから実行されます。
エイドリアンラトナパラ

3
素晴らしいトリック、素晴らしい作品!
genpfault

4
また、元のソリューションでは、画面内の単一のシェルセッションのみが修正されます。私はそれをテストしました。このソリューションが機能する理由は、元の環境から継承するのではなく、完全に新しいセッションを生成するためです。
ドロール14

4
これは本当に受け入れられた答えであるべきです。すてきなトリック、ありがとう!
-dotancohen

2
ただし、これにはパスワードを入力する必要があります。多くのセッションでパスワードを入力しようとすると、不自然になります。
レグーラス

156

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

exec su -l $USER

これを行う方法を忘れるたびに、これがグーグルで出てくる最初のリンクであるので、私はここにそれを投稿すると思った。


14
ユーザーをサブシェルに入れないための+1。これで通常どおりログアウト/終了できます。また、NOPASSWD:が/ etc / sudoersに設定されている場合は、代わりに使用exec sudo su -l $USERしてパスワードの入力を求められないようにすることができます。
イヴァンX 14

21
ご注意:sudoパスワードの入力を求められます。間違えた場合、端末は閉じます。
タイラーコリアー

1
@TylerCollier Ivan 言及しましたNOPASSWD:
ペポルアン

32

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

グループを1つだけ追加する場合は、次を使用しました。

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

これは、Legooolasの2層newgrpトリックのバリエーションですが、1行であり、プライマリグループを手動で入力する必要はありません。

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

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

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

at画面内のコマンドを使用すると、(これはscreenコマンドではなく、シェルコマンドであることに注意)を指定するものは何でもウィンドウでコマンドを実行します。

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

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

idScreenセッションで実行するためにバックティックをエスケープする必要があることに注意してください。また、コマンドの最後にScreenを入力してEnter キーを押すには^ Mを使用する必要があります。

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

  • 半分書かれたコマンドを削除するには、コマンドの先頭に「^ C」を追加します。
  • emacsウィンドウなどでコマンドを実行しないようにするには、ウィンドウタイトルなどでフィルタリングするように「at」に依頼します(上記の例では、すべてのウィンドウに一致する「#」を使用しますが、ウィンドウタイトル、ユーザーなど)。

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

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

素晴らしいライナー、他の副作用がないようです、ありがとう!
シリルデュションドリス


12

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

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


正直なところ、これは真実ではないと確信しています。Linuxボックスで前にそれを行う方法を見つけました。しかし、私の人生では、コマンドが何であったか思い出せません。見つかったら投稿します。編集:ちょうどそれを見つけた、私は答えとしてそれを投稿しています。
lunchmeat317

1
これを指摘していただきありがとうございます、これも私の理解です。ここでの他のすべての回答は、開いているシェルを置き換えるか、画面を再起動するかどうかに関係なく、単に新しいシェルを開きます。コマンドまたはスクリプトを発行し、Xセッションを含む実行中のすべてのセッションに新しいグループメンバーシップを反映させる魔法の万能薬はありません。
scravy

12

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

を使用して、必要な数のグループを追加しますusermod -G。次に、実行中のセッションを持つユーザーとして、newgrp -「-」引数のみで実行します。

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

これは、開いている各セッションから実行する必要があります-画面についてはあまり知りません。ただし、開いているすべてのセッションを反復処理して実行newgrpできる場合は、うまくいくはずです。グループやグループIDを知ることを心配する必要はありません。

幸運を祈ります。


11
Xセッション内でxtermを試行しましたが、機能しませんでした
-dwery

3
tmuxでセッションを試行しましたが、そこでも動作しませんでした
マイケル

2
Amazon linux 2で試してみましたが、うまく
いき

1
newgrp -新しいシェルプロセスを開始します
Piotr Findeisen

Mister_Tomの回答に対するあなたのコメントを踏まえると、これは他のすべての回答と同様に回避策です。Mister_Tomの答えはまだ正しいです。
ひどい

4

要約する:

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

「exec」を使用すると、既存のシェルがnewgrpコマンドによって開始された新しいシェルに置き換えられます(したがって、新しいシェルを終了するとログアウトされます)。

ファイナルnewgrp -は通常のプライマリグループを復元するために必要なので、後で作成するファイルはグループオーナーとしてそれを持ちます。

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


ところで、exec su - <username>グループが設定された新しいログインシェルを取得するために使用できますが、新しいシェルは端末からコマンドを読み取るため、スクリプトでは機能しません。を使用su -c "command ..." <myusername>してスクリプトを再起動することもできますが、結果のプロセスには制御端末がないため、スクリーンエディターまたは他のインタラクティブコマンドを実行しようとするとエラーが発生します。
jimav

なぜこれがダウン投票されたのですか?それが私に起こったことであり、私はそれが一番好きだと思うので、誰かがそれについて悪いことを説明できますか?
jasonmp85

ああ、テストする前に投票しました。「プライマリグループ」を置き換えnewgrp -ませ。ここでは、Patrick Conheadyの答えが最良のものです。プライマリグループを分岐も変更もしないからです。
jasonmp85

1

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


1

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

0

これはあなたが持っている場合にトリックを行い、場合によってはsudoもう一度パスワードを入力することを節約できます:

sudo su $USER
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.