Quando você executa groups username , pesquisa 1 o usuário em /etc/passwd e /etc/group (embora possa ser LDAP, NIS ou outra coisa 2 ) e mostra todos os grupos encontrados.
Por outro lado, quando você executa o comando groups sem nenhum argumento, ele simplesmente lista todos os grupos ele mesmo pertence a 3 - que é não necessariamente o mesmo que está listado em /etc/group . (Veja abaixo uma explicação.) Na verdade, as pesquisas somente feitas para /etc/group são para traduzir GIDs para nomes de grupos.
Cada processo tem um conjunto de credenciais , que contém (entre outras coisas) um "ID de grupo real" (GID primário), um "ID de grupo efetivo" (EGID) e uma lista de IDs de "grupo suplementar" (GIDs secundários). Por padrão, um processo herda suas credenciais de seu pai; no entanto, os processos em execução como raiz (UID 0) ou com o recurso CAP_SETUID têm permissão para definir credenciais arbitrárias.
Em particular, quando você efetua login no Linux (seja em um tty, X11 ou sobre SSH), o processo de login (/ bin / login, gdm, sshd) procura seu nome de usuário para determinar seu UID, GID principal e GIDs secundários. Em uma máquina pessoal, isso significa apenas ler as linhas apropriadas dos arquivos passwd e group (ou NIS, LDAP, etc.).
Em seguida, o processo de login muda 4 para essas credenciais antes de iniciar sua sessão, e cada processo que você iniciar a partir de agora terá exatamente o mesmo UID & GIDs - o sistema não verifica /etc/group anymore 5 e não selecionará nenhuma modificação feita.
Dessa forma, o processo /usr/bin/groups pertencerá aos mesmos grupos que você fez quando você efetuou login , e não ao que o banco de dados diz que você está.
Nota: A explicação acima também se aplica a quase todos os Unixes; para a família Windows NT (exceto UIDs e GIDs são todos chamados "SIDs", não há "grupo primário", as credenciais são chamadas de "token de processo" e CAP_SETUID é SeCreateTokenPrivilege ou < em> SeTcbPrivilege ); e provável para a maioria dos outros sistemas operacionais multiusuários.
1 getpwuid () e getgrouplist () são usados para procurar grupos de usuários.
2 No Linux, a glibc usa /etc/nsswitch.conf para determinar onde procura por essa informação.
3 groups usa getgid (), getegid () e getgroups () para obter suas próprias credenciais.
4 setuid (), setgid (), initgroups () e relacionados.
5 Uma exceção, é claro, são as várias ferramentas executadas com alto nível ( setuid ), como su , sudo , sg , newgrp , pkexec e assim por diante. Isso significa que su $USER gerará um shell com a lista atualizada de grupos.