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

debian gnu-screen linux permissions shell

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

# 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を実行して、usermodnewgrpの前後で確認することができます

これは各オープンセッションから実行しなければなりません – 私は画面のことはよく知りません。しかし、すべてのオープンセッションを反復処理して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 - は、通常のプライマリグループを復元するために必要です

注意: 元の投稿者の質問は、新しく追加されたグループを既存のプロセスに表示させる方法でした。gpasswdusermod コマンドは既存のプロセスには影響を与えません; 新しく追加された (または削除された) グループはアカウントに表示されます (アカウントからは消えます) が、既存のプロセスのパーミッションは変更されません。 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


タイトルとURLをコピーしました