Lorsque vous exécutez , il recherche 1 l'utilisateur donné dans ( et bien qu'il puisse être LDAP, NIS ou autre chose 2 ) et vous montre tous les groupes trouvés.groups username
/etc/passwd
/etc/group
D'autre part, lorsque vous exécutez la groups
commande sans aucun argument, il énumère simplement tous les groupes , il s'appartient à 3 - qui est pas nécessairement la même chose que ce qui est indiqué dans /etc/group
. (Voir ci-dessous pour une explication.) En fait, les seules recherches effectuées pour /etc/group
sont pour traduire les GID en noms de groupe.
Chaque processus possède un ensemble d' informations d' identification , qui contient (entre autres) un "ID de groupe réel" (GID principal), un "ID de groupe effectif" (EGID) et une liste d'ID de "groupe supplémentaire" (GID secondaires). Par défaut, un processus hérite ses informations d'identification de son parent; cependant, les processus s'exécutant en tant que root (UID 0) ou ayant la CAP_SETUID
capacité sont autorisés à définir des informations d'identification arbitraires.
En particulier, lorsque vous vous connectez à Linux (que ce soit dans un tty, X11 ou via SSH), le processus de connexion (/ bin / login, gdm, sshd) recherche votre nom d'utilisateur pour déterminer votre UID, GID principal et GID secondaires . Sur une machine personnelle, cela signifie simplement lire les lignes passwd
et les group
fichiers appropriés (ou NIS, LDAP, etc.).
Ensuite, le processus de connexion bascule 4 sur ces informations d'identification avant de démarrer votre session, et chaque processus que vous lancez aura désormais exactement les mêmes UID et GID - le système ne vérifie /etc/group
plus 5 et n'acceptera aucune modification apportée.
De cette façon, le /usr/bin/groups
processus appartiendra aux mêmes groupes que vous l'avez fait lorsque vous vous êtes connecté , et non à ce que la base de données indique que vous êtes.
Remarque: L'explication ci-dessus s'applique également à presque tous les Unix; à la famille Windows NT (sauf que les UID et GID sont tous appelés "SID", il n'y a pas de "groupe principal", les informations d'identification sont appelées "jeton de processus" et CAP_SETUID
sont SeCreateTokenPrivilege ou SeTcbPrivilege ); et probablement à la plupart des autres systèmes d'exploitation multi-utilisateurs.
1 getpwuid () et getgrouplist () sont utilisés pour rechercher les groupes d'un utilisateur.
2 Sous Linux, glibc utilise /etc/nsswitch.conf
pour déterminer où chercher ces informations.
3 groups
utilise getgid (), getegid () et getgroups () pour obtenir ses propres informations d'identification.
4 setuid (), setgid (), initgroups () et connexes.
5 exception An, bien entendu, les différents outils qui exécutent élevée ( setuid ) tels que su
, sudo
, sg
, newgrp
, pkexec
, et ainsi de suite. Cela signifie que su $USER
va générer un shell avec la liste des groupes mise à jour.