2011-04-17 19:50:06 +0000 2011-04-17 19:50:06 +0000
377
377

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

# usermod -G <grouplist> <user>

を使ってユーザーのセカンダリグループリストを割り当てるときに、実行中のセッションをすべてログアウトせずに強制的にグループ割り当てを有効にすることは可能ですか?

これは、Screen セッションが多くの実行中のシェルと一緒に存在している状況で、グループ割り当てを有効にするためにセッション全体を破壊する必要があるため、非常に便利です。

実行中のシェルで newgrp コマンドを使ってユーザーのプライマリグループを変更することができると思いますが、セカンダリグループのための代替案はありますか?

理想的には、すべてのシェルで手動で実行することなく、それぞれのシェルで有効になるものが欲しいのですが、それができない場合は、 Screen がそれぞれのシェルで同じコマンドを実行するように強制する方法があるかもしれません。

回答 (12)

400
400
400
2011-11-06 15:28:07 +0000

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

su - $USER

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

id
221
221
221
2011-10-10 17:36:48 +0000

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

id -g

…は、現在のプライマリグループIDを与えます。この例では、これを orig_group と呼びます。次に:

newgrp <new group name>

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

newgrp <orig_group>

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

これは恐ろしいことに、一度に1つのグループしか追加されませんが、私のXセッション全体でログアウトせずに追加されたグループを取得するために数回助けてくれました。 例えば、sshfs が動作するように fuse をユーザのグループとして追加したい場合など)。

168
168
168
2013-06-18 16:27:30 +0000

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

exec su -l $USER

私は私がこれを行う方法を忘れてしまうたびに、これはgoogleで出てくる最初のリンクですので、私はここにそれを投稿するだろうと考えました。

35
35
35
2014-12-17 21:33:21 +0000

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

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

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。sg は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

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

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する 

exec sg newgrp id -gn “`

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。at は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

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

id -gn### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する

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

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。stuff は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

Screen の [ &007 ]&003 コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく Screen コマンドです)。

^M” “`

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp ### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する 

exec sg newgrp id -gn ”`

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。&007 は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

Screen の [ &007 ]&003 コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく Screen コマンドです)。

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する 

exec sg newgrp id -gn “`

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。&007 は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

Screen の [ &007 ]&003 コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく Screen コマンドです)。

id -gn### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する

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

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。&007 は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

Screen の [ &007 ]&003 コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく Screen コマンドです)。

^M” “`

id -gn### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する

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

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。&007 は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

Screen の [ &007 ]&003 コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく Screen コマンドです)。

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する 

exec sg newgrp id -gn ”`

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。&007 は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

Screen の [ &007 ]&003 コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく Screen コマンドです)。

id -gn### 1. 1.ログアウトと再ログインをせずに新しいグループのシェルを取得する

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

これはLegooolasの2層のnewgrpのトリックのバリエーションですが、1行にまとめられていて、手動でプライマリグループを入力する必要はありません。&007 は新しいシェルが既存のシェルを置き換えることを意味しているので、二度も「ログアウト」する必要はありません。また、環境の更新(グループの追加以外)もないので、現在の作業ディレクトリなどはそのまま保持されます。2. セッション内のすべてのウィンドウでコマンドを実行する

Screen の [ &007 ]&003 コマンドは、指定したウィンドウでコマンドを実行します (これはシェルコマンドではなく Screen コマンドです)。

^M" “`

^M” “`

&007 がスクリーンセッションで実行されるようにするためにはバ ックティックをエスケープする必要があることと、コマンドの最後に ‘enter’ を押すためにスクリーンを取得するために ^M が必要であることに注意してください。したがって、スクリーンウィンドウのいずれかがコマンドプロンプトで中途半端に書かれたコマンドを持っていたり、シェル以外のアプリケーション (例えば emacs, top) を実行していたりすると、何か奇妙なことが起こるかもしれません。もしこれが問題であるならば、私はいくつかのアイデアを持っています:

  • 中途半端に書かれたコマンドを取り除くには、コマンドの先頭に”^C “を追加することができます。
  • emacs のウィンドウなどでコマンドを実行しないようにするには、`at’ にウィンドウのタイトルなどでフィルタをかけることができます (上の例では、すべてのウィンドウにマッチする ”#“ を使っていますが、ウィンドウのタイトルやユーザなどでフィルタをかけることもできます)。

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

&001

18
18
18
2016-10-07 04:53:42 +0000

コマンドを使って問題を解決しました:

newgrp <GroupName>

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

12
12
12
2012-01-30 16:17:03 +0000

これができます。

usermod -G を使って、必要な数だけグループを追加します。そして、実行中のセッションを持つユーザーとして、’-‘ 引数だけで newgrp - を実行します。

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

これは開いているセッションごとに実行しなければなりません - 画面のことはよくわかりません。しかし、すべてのオープンセッションを反復処理してnewgrpを実行できるのであれば、問題ないはずです。グループやグループIDを知ることを心配する必要はないでしょう。

頑張ってください。

11
11
11
2011-04-25 17:56:34 +0000

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

ここで投票された多くの回答は、新しい環境で新しいシェルを起動する(再ログインと同じ)回避策を使用しているようです。

4
4
4
2017-02-10 23:21:38 +0000

exec’ を使うということは、既存のシェルを newgrp コマンドで起動された新しいシェルに置き換えることを意味します (新しいシェルから抜けるとログアウトします)。

最後の newgrp - は、通常のプライマリグループを復元するために必要です。新しく追加された(または削除された)グループは、あなたのアカウント、つまり/etc/groupや/etc/gshadowファイルに表示されますが、既存のプロセスのパーミッションは変更されません。パーミッションを削除するには、実行中のプロセスをすべて終了させなければなりません。

1
1
1
2018-04-28 13:30:22 +0000

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
0
0
2014-08-06 14:03:21 +0000

これはあなたがsudoを持っている場合にトリックを実行し、いくつかのケースではパスワードをもう一度入力する必要がなくなります:

sudo su $USER
0
0
0
2019-10-21 22:03:04 +0000

これをシェルスクリプトで行う必要がありました(スクリプトは現在のユーザをグループに追加し、そのグループのメンバシップを必要とする後のコマンドを実行します)。newgrp コマンドは、任意のコマンドではなく、新しいシェルを実行することしかできないという点で脆いです (元のコマンドライン引数で現在のシェルスクリプトを再実行したいのです)。

ここに私の解決策があります。(周囲のスクリプトは、必要なグループが現在アクティブでない場合にのみこの関数を実行するために、ある種のブランチを必要としていることに注意してください):

(注意: スクリプトは sudo adduser $user docker を実行したことを暗示しています。

0
0
0
2014-11-13 16:07:46 +0000

私も同じような問題がありましたが、ログインしていないユーザーにも問題がありました。nscd を再起動しても解決しませんでしたが、以下のコマンドを実行しても解決しました: nscd -i group. これは nscd (キャッシングデーモン) にグループファイルをリロードするように指示しているはずです。

関連する質問

6
10
11
8
9