Linux: grupos vs. nombre de usuario de grupos


12

¿Alguien sabe por qué el comando de Linux

    groups 

muestra una salida diferente a

    groups username 

El usuario conectado es el mismo que el nombre de usuario del parámetro. Ejemplo:

    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

1
Hay tantos duplicados de esta pregunta que ni siquiera sé por dónde empezar.
user1686

Respuestas:


12

Cuando ejecuta , busca 1 en el usuario dado y (aunque puede ser LDAP, NIS u otra cosa 2 ) y le muestra todos los grupos encontrados.groups username/etc/passwd/etc/group

Por otro lado, cuando ejecuta el groupscomando sin ningún argumento, simplemente enumera todos los grupos a los que pertenece 3 , lo que no es necesariamente lo mismo que se enumera /etc/group. (Consulte a continuación para obtener una explicación). De hecho, las únicas búsquedas realizadas /etc/groupson para traducir GID a nombres de grupo.


Cada proceso tiene un conjunto de credenciales , que contiene (entre otras cosas) un "ID de grupo real" (GID primario), un "ID de grupo efectivo" (EGID) y una lista de ID de "grupo suplementario" (GID secundario). Por defecto, un proceso hereda sus credenciales de su padre; sin embargo, los procesos que se ejecutan como root (UID 0) o que tienen la CAP_SETUIDcapacidad pueden establecer credenciales arbitrarias.

En particular, cuando inicia sesión en Linux (ya sea en un tty, X11 o sobre SSH), el proceso de inicio de sesión (/ bin / login, gdm, sshd) busca su nombre de usuario para determinar su UID, GID primario y GID secundario. . En una máquina personal, esto solo significa leer las líneas passwdy los grouparchivos apropiados (o NIS, LDAP, etc.).

A continuación, el proceso de inicio de sesión interruptores 4 a esas credenciales antes de iniciar la sesión, y todos los procesos que inicie a partir de ahora tendrá exactamente el mismo UID y GID - el sistema no comprueba /etc/groupmás 5 y no recoge todas las modificaciones realizadas.

De esta manera, el /usr/bin/groupsproceso pertenecerá a los mismos grupos que usted cuando inició sesión , no a lo que la base de datos dice que está.

Nota: La explicación anterior también se aplica a casi todos los Unixes; a la familia de Windows NT (excepto que los UID y GID se denominan "SID", no hay un "grupo primario", las credenciales se denominan "token de proceso" y CAP_SETUIDes SeCreateTokenPrivilege o SeTcbPrivilege ); y probablemente para la mayoría de los otros sistemas operativos multiusuario.


1 getpwuid () y getgrouplist () se utilizan para buscar grupos de usuarios.

2 En Linux, glibc usa /etc/nsswitch.confpara determinar dónde buscar esta información.

3 groups usa getgid (), getegid () y getgroups () para obtener sus propias credenciales.

4 setuid (), setgid (), initgroups () y relacionados.

5 Una excepción, por supuesto, es las diferentes herramientas que se ejecutan elevada ( setuid ), tales como su, sudo, sg, newgrp, pkexec, y así sucesivamente. Esto significa que su $USERgenerará un shell con la lista de grupos actualizada.


3

groupspor sí solo otorga la pertenencia al grupo actual del propietario del proceso. Esto puede diferir de groups <username>si groupdb ha cambiado desde que comenzó el proceso o si el propietario del proceso cambió.


groupsno proporciona la membresía actual , sino la que era "actual" en el momento en que se llamó al proceso de inicio de sesión (/ sbin / login, gdm, sshd) initgroups().
user1686

1

Simplemente reinicie la computadora y los grupos y grupos de usuarios deberían dar los mismos resultados.

La razón por la que eran diferentes era porque te agregaste a un nuevo grupo del que no eras miembro cuando comenzaste la computadora.


¡Ciertamente no necesita reiniciar todo el sistema! Solo necesita comenzar una nueva sesión de inicio de sesión (es decir, en una nueva consola virtual, usando su, cerrando y volviendo a abrir la sesión actual). También puede usar newgrppara iniciar procesos con el nuevo grupo incluido.
pabouk

1
Solo pretendía dar una solución simple y rápida que funcionará siempre. Hay muchas otras respuestas que ya responden esta pregunta con mucho detalle. A veces lo que la gente quiere, como fue en mi caso, es una solución simple que simplemente funciona sin tener que pasar por varios pasos.
Alex

0

Corre updatedb, mira si hay algún cambio.

Lo mismo en mi máquina OSX cuando groupdb no ha cambiado:

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$ 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.