あなたが実行すると、それは見上げ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、更新されたグループリストでシェルを生成することを意味します。