Quando você executa , ele pesquisa 1 usuário especificado e (embora possa ser LDAP, NIS ou algo mais 2 ) e mostra todos os grupos encontrados.groups username
/etc/passwd
/etc/group
Por outro lado, quando você executa o groups
comando sem argumentos, ele simplesmente lista todos os grupos aos quais pertence 3 - o que não é necessariamente o mesmo que o listado /etc/group
. (Veja abaixo uma explicação.) De fato, as únicas pesquisas feitas /etc/group
são para traduzir GIDs em nomes de grupos.
Cada processo possui 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, processos em execução como raiz (UID 0) ou com a CAP_SETUID
capacidade têm permissão para definir credenciais arbitrárias.
Em particular, quando você faz logon no Linux (seja em um tty, X11 ou SSH), o processo de login (/ bin / login, gdm, sshd) consulta seu nome de usuário para determinar seu UID, GID principal e GID secundário . Em uma máquina pessoal, isso significa apenas ler as linhas passwd
e group
arquivos apropriados (ou NIS, LDAP, etc.).
Em seguida, o processo de login alterna 4 para essas credenciais antes de iniciar sua sessão, e todo processo iniciado a partir de agora terá exatamente os mesmos UID e GIDs - o sistema não verifica /etc/group
mais 5 e não realiza nenhuma modificação.
Dessa forma, o /usr/bin/groups
processo pertencerá aos mesmos grupos que você fazia quando você efetuou login , 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; à família Windows NT (exceto UIDs e GIDs são todos chamados "SID", não há "grupo principal", as credenciais são chamados de o "processo de token", e CAP_SETUID
é SeCreateTokenPrivilege ou SeTcbPrivilege ); e provavelmente para a maioria dos outros sistemas operacionais multiusuário.
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 procurar essas informações.
3 groups
usa getgid (), getegid () e getgroups () para obter suas próprias credenciais.
4 setuid (), setgid (), initgroups () e relacionados.
5 Uma excepção, é claro, é as várias ferramentas que executam elevadas ( setuid ), tais como su
, sudo
, sg
, newgrp
, pkexec
, e assim por diante. Isso significa que su $USER
irá gerar um shell com a lista de grupos atualizada.