Po uruchomieniu wyszukuje 1 danego użytkownika i (chociaż może to być LDAP, NIS lub coś innego 2 ) i pokazuje wszystkie znalezione grupy.groups username
/etc/passwd
/etc/group
Z drugiej strony, po uruchomieniu groups
polecenia bez żadnych argumentów, po prostu wyświetla listę wszystkich grup, do których on sam należy, do 3 - co niekoniecznie jest takie samo jak to, co jest wymienione /etc/group
. (Objaśnienia znajdują się poniżej). W rzeczywistości jedynymi dokonanymi przeglądami /etc/group
są tłumaczenia GID na nazwy grup.
Każdy proces ma zestaw poświadczeń , który zawiera (między innymi) „rzeczywisty identyfikator grupy” (podstawowy GID), „efektywny identyfikator grupy” (EGID) oraz listę „dodatkowych grupowych” identyfikatorów (wtórne GID). Domyślnie proces dziedziczy dane uwierzytelniające po rodzicu; jednak procesy działające jako root (UID 0) lub posiadające taką CAP_SETUID
możliwość mogą ustawić dowolne poświadczenia.
W szczególności, gdy logujesz się do systemu Linux (czy to w tty, X11, czy przez SSH), proces logowania (/ bin / login, gdm, sshd) wyszukuje twoją nazwę użytkownika w celu ustalenia twojego UID, podstawowego GID i pomocniczego GID . Na komputerze osobistym oznacza to po prostu odczyt odpowiednich wierszy passwd
i group
plików (lub NIS, LDAP itp.).
Następnie proces logowania przełącza 4 na te dane uwierzytelniające przed rozpoczęciem sesji, a każdy proces, który uruchomisz odtąd, będzie miał dokładnie takie same UID i GID - system nie sprawdza /etc/group
już 5 i nie wykrywa żadnych dokonanych modyfikacji.
W ten sposób /usr/bin/groups
proces będzie należeć do tych samych grup, co podczas logowania , a nie do tego, co mówi baza danych.
Uwaga: powyższe wyjaśnienie dotyczy także prawie wszystkich uniksów; do rodziny Windows NT (oprócz UID i GID wszystkie nazywane są „SID”, nie ma „grupy podstawowej”, poświadczenia nazywane są „tokenem procesu” i CAP_SETUID
są to SeCreateTokenPrivilege lub SeTcbPrivilege ); i prawdopodobnie dla większości innych systemów operacyjnych dla wielu użytkowników.
1 getpwuid () i getgrouplist () służą do wyszukiwania grup użytkowników.
2 W systemie Linux glibc używa /etc/nsswitch.conf
do określenia, gdzie szukać tych informacji.
3 groups
używa getgid (), getegid () i getgroups () w celu uzyskania własnych poświadczeń.
4 setuid (), setgid (), initgroups () i powiązane.
5 wyjątkiem, oczywiście, różne narzędzia, które działają zwiększone ( setuid ), takie jak su
, sudo
, sg
, newgrp
, pkexec
, i tak dalej. Oznacza to, że su $USER
spawnuje powłokę ze zaktualizowaną listą grup.