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.