bashの子プロセスにユーザーグループを渡す方法は?

bashの子プロセスにユーザーグループを渡す方法は?

ご存知のように、新しいグループに自分自身を追加すると、ログアウトして再度ログインするまで変更は反映されません。

$ sudo adduser me newgroup
$ groups
me sudo
$ groups me
me sudo newgroup
$

この奇妙な動作は、groups新しいグループメンバーシップが解釈されてシェルに表示されないために発生します。しかし、groups me実際には参照な/etc/groupので、新しいメンバーシップが表示されます。

しかし、新しいシェルがこの変更を認識しないのは奇妙だと思います。

$ bash
$ groups
me sudo

私が知っている限り、新しいグループメンバーシップを反映する方法は、(1)newgrpまたは(2)ログアウト後に再度ログインすることです。 sgsu

したがって、bashグループのリストは何らかの方法でその子孫に渡される必要があります。環境(試してみましたprintenv)やカーネルのtask_struct(gid、egid、sgid、およびfsgidのみ)にもありません。

私は何をすべきかわかりません。

ベストアンサー1

グループは親プロセスのプロセスによって継承されます。 Bashはこの問題に選択肢がありませんでした。ルートとして実行されるプロセスは、要求に応じて新しい補足グループを取得できます。ルートとして実行されないプロセスは、補足グループのみを削除できます。

パラメータのないコマンドはgroups独自のコマンドを返します。グループ一覧(親から継承されます):実際のグループ、有効なグループ、および補足グループ。このコマンドは、ユーザーデータベースとグループデータベースで関連group SOMEUSERグループを検索します。SOMEUSER

ログイン時に、ログインプロセスがrootユーザーからターゲットユーザーに切り替えられる前に、ログインプロセスの一部としてユーザーとグループデータベースに基づいてグループが割り当てられます。コマンドを使用し、実行時に追加のグループを取得できますnewgrpsusg設定値ルート;このコードは、ログイン時にユーザーに付与されるグループのみを付与する方法で作成されます(ルートは、必要なすべてのグループを取得できることを除く)。

Linuxカーネルでは、プロセスのUIDとGIDが次の場所に書き込まれます。struct cred。補足グループは、group_info以下を指すフィールドにあります。struct group_infoグループIDの配列を含みます。

おすすめ記事