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 groups
comando 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/group
son 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_SETUID
capacidad 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 passwd
y los group
archivos 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/group
más 5 y no recoge todas las modificaciones realizadas.
De esta manera, el /usr/bin/groups
proceso 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_SETUID
es 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.conf
para 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 $USER
generará un shell con la lista de grupos actualizada.