以下を使用してユーザーの2次グループリストを割り当てる場合
# usermod -G <grouplist> <user>
実行中のすべてのセッションをログアウトせずにこのグループ割り当てを強制的に有効にすることはできますか?
グループ割り当てを行うためにセッション全体を本質的に破棄する必要があるので、これは Screen セッションが多くの実行中のシェルと共に存在する状況で非常に役に立ちます。効きます。
newgrp
コマンドを使用して、実行中のシェルでユーザーのプライマリグループを変更できると思います - セカンダリグループで機能する代替手段はありますか?
理想的には、各シェルで手動で実行しなくても各シェルで有効になるようなものが必要ですが、それに失敗すると、Screenに同じコマンドを強制的に実行させる何らかの方法が必要になります。
非常に厄介ですが、特定のグループに対してこれを実現するために2つのnewgrp
name__層を使用することができます。
id -g
...現在のプライマリグループIDを教えてくれます。この例では、これをorig_group
と呼びます。その後:
newgrp <new group name>
...そのグループをプライマリとして切り替え、それをgroups
name__またはid -G
によって返されるグループのリストに追加します。今、さらに:
newgrp <orig_group>
...あなたは新しいグループを見ることができ、プライマリが元のものであるシェルを取得します。
これは恐ろしいことで、一度に1つのグループしか追加されませんが、ログアウトせずにグループを追加したり、Xセッション全体でグループを追加したりすることができましたsshfsが動作するように).
編集:これはsu
name__がするようにあなたのパスワードをタイプすることもあなたに要求しません。
シェルの内側から、次のコマンドを発行できます。
su - $USER
idは新しいグループを一覧表示します。
id
このリンクからのこの気の利いたトリックは素晴らしい作品です!
exec su -l $USER
やり方を忘れるたびにここに投稿することにしましたが、これがGoogleで最初に登場したリンクです。
グループを1つだけ追加する場合は、次のようにしました。
exec sg <new group name> newgrp `id -gn`
これはLegooolasの2層のnewgrpトリックのバリエーションですが、それは一列になっており、手動でプライマリグループに入る必要はありません。
sg
はnewgrpですが、新しいグループIDで実行するコマンドを受け付けます。 exec
は、新しいシェルが既存のシェルを置き換えることを意味するので、2回「ログアウト」する必要はありません。
Suとは異なり、パスワードを入力する必要はありません。 (グループを追加する以外に)あなたの環境を更新することもしないので、あなたはあなたの現在の作業ディレクトリなどを保持します。
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など)を実行している場合、奇妙なことが起こるかもしれません。これが問題になる場合は、いくつか考えがあります。
特定のウィンドウ(ウィンドウ番号で識別される)でコマンドを実行するには、次のようにします。
screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
あなたはこれを行うことができます。
usermod -G
を使って必要なだけグループを追加します。次に、セッションを実行しているユーザーとして、引数 ' - 'を付けてnewgrp -
を実行します。
これにより、グループIDがデフォルトに再初期化されますが、セカンダリグループも設定されます。これを確認するには、現在のセッションからgroups
とusermod
の前後にnewgrp
を実行します。
これは開いている各セッションから実行する必要があります - 私はscreenについてはあまり知りません。しかし、開いているすべてのセッションを反復処理してnewgrp
を実行することが可能であれば、それは良いことです。グループやグループIDを知っていることを心配する必要はありません。
頑張ってください。
グループは通常ログイン時に列挙されます。ログアウトせずに再度ログインせずにグループ列挙を強制的にやり直す方法はありません。
ここで投票された多くの回答は、新鮮な環境で新しいシェルを起動する回避策を使用するようです(再度ログインするのと同じ)。親シェルおよび他のすべての継続的に実行されているプログラムは、通常、クリーンログアウトおよびログインの後で通常は新しいシェルから再起動されるまで、新しいグループメンバーシップを受け取りません。
要約する:
exec newgrp <newlyaddedgroupname1>
exec newgrp <newlyaddedgroupname2>
...
exec newgrp -
'exec'を使用することは、newgrpコマンドで開始された新しいシェルで既存のシェルを置き換えることを意味します(したがって、新しいシェルから出るとログアウトします)。
最後のnewgrp -
は通常のプライマリグループを復元するのに必要なので、後で作成するファイルはそれをグループの所有者にします。
注意:最初の投稿者の質問は、新しく追加されたグループを既存のプロセスに表示する方法です。 gpasswd
およびusermod
コマンドは既存のプロセスには影響しません。新しく追加された(または削除された)グループは、アカウント、つまり/ etc/groupファイルと/ etc/gshadowファイルに表示されます(表示されなくなります)が、既存のプロセスに対する権限は変更されません。実行中のプロセスを強制終了する必要がある権限を削除するには。 newgrp -
は/ etc/groupを再読み込みしてグループリストをリセットすることはありません。代わりに、以前プロセスに関連付けられていたグループを使用するだけのようです。
私は同様の問題を抱えていましたが、ログインしていないユーザーのためにも。 nscdを再起動しても役に立ちませんでしたが、このコマンドを実行してもnscd -i group
となりました。これはnscd(キャッシングデーモン)にgroupsファイルをリロードするように指示します。
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
あなたがSudo
を持っているなら、これはトリックをします、そして、それはあなたのパスワードをもう一度入力することからあなたを救うことができる場合があります:
Sudo su $USER