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.