Linux: grupos versus grupos nome de usuário

9

Alguém sabe porque o comando linux

    groups 

mostra uma saída diferente de

    groups username 

O usuário logado é o mesmo que o nome de usuário do parâmetro. Exemplo:

    thorsten@ubuntu:~/tmp$ groups
    thorsten adm dialout cdrom plugdev lpadmin admin sambashare
    thorsten@ubuntu:~/tmp$ groups thorsten
    thorsten : thorsten adm dialout cdrom plugdev nogroup lpadmin admin sambashare
    
por Thorsten Niehues 24.04.2012 / 21:51

4 respostas

10

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.

    
por 24.04.2012 / 23:39
3

groups por conta própria fornece a associação do grupo atual ao proprietário do processo. Isso pode diferir de groups <username> se o groupdb foi alterado desde o início do processo ou quando o proprietário do processo foi alterado.

    
por 24.04.2012 / 21:54
1

Basta reiniciar o computador e os grupos e grupos de usuários devem fornecer os mesmos resultados.

O motivo pelo qual eles eram diferentes foi porque você se inscreveu em um novo grupo do qual não era usuário quando iniciou o computador.

    
por 18.11.2013 / 10:31
0

Execute updatedb , veja se há alguma alteração.

O mesmo na minha máquina OSX quando o groupdb não mudou:

albert-hotspot:~ sami$ groups sami
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ groups
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ 
    
por 24.04.2012 / 22:12