ご存知のように、新しいグループに自分自身を追加すると、ログアウトして再度ログインするまで変更は反映されません。
$ sudo adduser me newgroup
$ groups
me sudo
$ groups me
me sudo newgroup
$
この奇妙な動作は、groups
新しいグループメンバーシップが解釈されてシェルに表示されないために発生します。しかし、groups me
実際には参照な/etc/group
ので、新しいメンバーシップが表示されます。
しかし、新しいシェルがこの変更を認識しないのは奇妙だと思います。
$ bash
$ groups
me sudo
私が知っている限り、新しいグループメンバーシップを反映する方法は、(1)newgrp
または(2)ログアウト後に再度ログインすることです。 sg
su
したがって、bash
グループのリストは何らかの方法でその子孫に渡される必要があります。環境(試してみましたprintenv
)やカーネルのtask_struct(gid、egid、sgid、およびfsgidのみ)にもありません。
私は何をすべきかわかりません。
ベストアンサー1
グループは親プロセスのプロセスによって継承されます。 Bashはこの問題に選択肢がありませんでした。ルートとして実行されるプロセスは、要求に応じて新しい補足グループを取得できます。ルートとして実行されないプロセスは、補足グループのみを削除できます。
パラメータのないコマンドはgroups
独自のコマンドを返します。グループ一覧(親から継承されます):実際のグループ、有効なグループ、および補足グループ。このコマンドは、ユーザーデータベースとグループデータベースで関連group SOMEUSER
グループを検索します。SOMEUSER
ログイン時に、ログインプロセスがrootユーザーからターゲットユーザーに切り替えられる前に、ログインプロセスの一部としてユーザーとグループデータベースに基づいてグループが割り当てられます。コマンドを使用し、実行時に追加のグループを取得できますnewgrp
。su
sg
設定値ルート;このコードは、ログイン時にユーザーに付与されるグループのみを付与する方法で作成されます(ルートは、必要なすべてのグループを取得できることを除く)。
Linuxカーネルでは、プロセスのUIDとGIDが次の場所に書き込まれます。struct cred
。補足グループは、group_info
以下を指すフィールドにあります。struct group_info
グループIDの配列を含みます。