あなたが実行すると、それは見上げ1を与えられたユーザでと(それがLDAP、NISまたは何か他のものであってもよい2)やショーあなたのすべてのグループが見つかりました。groups username
/etc/passwd
/etc/group
一方、groups
引数を指定せずにコマンドを実行すると、コマンド自体が3に属するすべてのグループが一覧表示されます。これは、の一覧と必ずしも同じではありません/etc/group
。(説明については、以下を参照してください。)実際に行われる検索は、GIDをグループ名に変換するためだけ/etc/group
です。
各プロセスには、「本当のグループID」(プライマリGID)、「実効グループID」(EGID)、および「補足グループ」ID(セカンダリGID)のリストを含む資格情報のセットがあります。デフォルトでは、プロセスは親から資格を継承します。ただし、root(UID 0)として実行されている、またはそのCAP_SETUID
機能を持つプロセスは、任意の資格情報を設定できます。
特に、(tty、X11、またはSSHを介して)Linuxにログインすると、ログインプロセス(/ bin / login、gdm、sshd)がユーザー名を検索して、UID、プライマリGID、セカンダリGIDを決定します。個人のマシンでは、これはファイルpasswd
とgroup
ファイル(またはNIS、LDAPなど)から適切な行を読み取ることを意味します。
次に、ログインプロセスは、セッションを開始する前にこれらの資格情報に4を切り替えます。これから起動するすべてのプロセスは、まったく同じUIDとGIDを持ちます。システムはチェックを行わ/etc/group
なくなり5、行われた変更を取得しません。
このように、/usr/bin/groups
プロセスは、ログインしたときと同じグループに属します。データベースは、自分がいると言っているグループではありません。
注:上記の説明は、ほとんどすべてのUnixにも当てはまります。Windows NTの家族に(UIDとGIDは、すべて「のSID」と呼ばれている以外、資格情報は「プロセストークン」と呼ばれていない「プライマリグループ」が存在しない、とCAP_SETUID
あるSeCreateTokenPrivilegeまたはSeTcbPrivilege); そして他のほとんどのマルチユーザーオペレーティングシステムにありそうです。
1 getpwuid()およびgetgrouplist()は、ユーザーのグループを検索するために使用されます。
2 Linuxでは、glibcはこの情報を探す場所を/etc/nsswitch.conf
決定するために使用します。
3 groups
は、getgid()、getegid()、およびgetgroups()を使用して、独自の資格情報を取得します。
4 setuid()、setgid()、initgroups()および関連。
5アン例外は、当然のことながら、上昇(RUN様々なツールであるのsetuidなど)su
、sudo
、sg
、newgrp
、pkexec
、など。これはsu $USER
、更新されたグループリストでシェルを生成することを意味します。