Quando corri groups nome utente , alza lo sguardo 1 l'utente specificato in /etc/passwd e /etc/group (anche se può essere LDAP, NIS o qualcos'altro 2 ) e mostra tutti i gruppi trovati.
D'altra parte, quando esegui il groups comando senza argomenti, elenca semplicemente tutti i gruppi esso stesso appartiene a 3 - che è non necessariamente lo stesso di ciò che è elencato in /etc/group. (Vedi sotto per una spiegazione). In effetti, il solo ricerche fatte a /etc/group sono per la traduzione di GID per i nomi dei gruppi.
Ogni processo ha un insieme di credenziali , che contiene (tra le altre cose) un "ID gruppo reale" (GID primario), un "ID gruppo efficace" (EGID) e un elenco di ID "gruppo supplementare" (GID secondari). Di default, un processo eredita le sue credenziali dal suo genitore; tuttavia, i processi eseguiti come root (UID 0) o con il CAP_SETUID capacità sono autorizzati a impostare credenziali arbitrarie.
In particolare, quando si accede a Linux (sia in tty, X11 o SSH), il processo di login (/ bin / login, gdm, sshd) cerca il proprio nome utente per determinare l'UID, il GID primario e i GID secondari . Su una macchina personale, questo significa solo leggere le linee appropriate da passwd e group file (o NIS, LDAP, ecc.).
Quindi, passa il processo di login 4 a quelle credenziali prima di iniziare la sessione, e ogni processo che avvierai da ora in poi avrà lo stesso identico UID e amp; GID: il sistema non controlla /etc/group più 5 e non prenderà alcuna modifica fatta.
In questo modo, il /usr/bin/groups il processo apparterrà agli stessi gruppi come hai fatto tu quando hai effettuato il login non ciò che il database dice che sei dentro
Nota: La spiegazione di cui sopra si applica anche a quasi tutti gli Unix; alla famiglia Windows NT (eccetto UID e GID sono tutti chiamati "SID", non c'è "gruppo primario", le credenziali sono chiamate "token di processo" e CAP_SETUID è SeCreateTokenPrivilege o SeTcbPrivilege ); e probabilmente alla maggior parte degli altri sistemi operativi multi-utente.
1 getpwuid () e getgrouplist () sono usati per cercare i gruppi di un utente.
2 Su Linux, usa glibc /etc/nsswitch.conf determinare dove cercare queste informazioni
3 groups usa getgid (), getegid () e getgroups () per ottenere le proprie credenziali.
4 setuid (), setgid (), initgroups () e relativi.
5 Un'eccezione, ovviamente, sono i vari strumenti che eseguono elevati ( setuid ) ad esempio su, sudo, sg, newgrp, pkexec, e così via. Ciò significa che su $USER genererà una shell con l'elenco dei gruppi aggiornato.