Linux: nome de usuário de grupos x grupos

12

Alguém sabe por que o comando linux

    groups 

mostra uma saída diferente da

    groups username 

O usuário conectado é 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
Thorsten Niehues
fonte
1
Há tantas duplicatas dessa pergunta que nem sei por onde começar.
usar o seguinte comando

Respostas:

12

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 groupscomando 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/groupsã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_SETUIDcapacidade 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 passwde grouparquivos 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/groupmais 5 e não realiza nenhuma modificação.

Dessa forma, o /usr/bin/groupsprocesso 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.confpara 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 $USERirá gerar um shell com a lista de grupos atualizada.

user1686
fonte
3

groupspor si só fornece a associação atual do grupo do proprietário do processo. Isso pode diferir groups <username>se o groupdb mudou desde o início do processo ou se o proprietário do processo foi alterado.

Ignacio Vazquez-Abrams
fonte
groupsnão fornece a associação atual , mas o que era "atual" no momento em que o processo de login (/ sbin / login, gdm, sshd) foi chamado initgroups().
usar o seguinte comando
1

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

A razão pela qual eles eram diferentes foi porque você se adicionou a um novo grupo do qual não era membro quando iniciou o computador.

Alex
fonte
Você certamente não precisa reiniciar o sistema inteiro! Você só precisa iniciar uma nova sessão de logon (ou seja, em um novo console virtual, usando su, fechando e reabrindo a sessão atual). Você também pode usar newgrppara iniciar processos com o novo grupo incluído.
pabouk
1
Eu pretendia apenas fornecer uma solução simples e rápida, que funcionasse sempre. Existem muitas outras respostas que já respondem a essa pergunta em muitos detalhes. Às vezes, o que as pessoas querem, como no meu caso, é uma solução simples que simplesmente funciona sem passar por várias etapas.
28413 Alex
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$ 
Léo Léopold Hertz 준영
fonte