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
linux
user-accounts
Thorsten Niehues
fonte
fonte
Respostas:
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
egroup
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 quesu $USER
irá gerar um shell com a lista de grupos atualizada.fonte
groups
por si só fornece a associação atual do grupo do proprietário do processo. Isso pode diferirgroups <username>
se o groupdb mudou desde o início do processo ou se o proprietário do processo foi alterado.fonte
groups
não fornece a associação atual , mas o que era "atual" no momento em que o processo de login (/ sbin / login, gdm, sshd) foi chamadoinitgroups()
.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.
fonte
su
, fechando e reabrindo a sessão atual). Você também pode usarnewgrp
para iniciar processos com o novo grupo incluído.Execute
updatedb
, veja se há alguma alteração.O mesmo na minha máquina OSX quando o groupdb não mudou:
fonte