¿Cómo puedo averiguar qué usuarios están en un grupo dentro de Linux?


68

Recientemente he estado creando nuevos usuarios y asignándolos a ciertos grupos. Me preguntaba si hay un comando que muestra todos los usuarios asignados a un determinado grupo. He intentado usar el comando 'grupos', sin embargo, cada vez que lo uso, dice 'grupos: no encontrado'


3
Ese es el groupscomando. Es poco probable que no lo tenga en Linux, ya que es parte de coreutils.
Thomas Dickey

@ThomasDickey Pero es posible, como en algunos NAS.
Thomas W.

Respuestas:


43

Puedes usar grep:

grep '^group_name_here:' /etc/group

Esto solo enumera las membresías de grupo suplementarias, no el usuario que tiene este grupo como su grupo principal. Y solo encuentra grupos locales, no grupos de un servicio de red como LDAP.


66
No funciona con autenticación centralizada.
Maxim Egorushkin

1
Esto podría ser realmente confuso probablemente debido a la diferencia primaria / secundaria. Creo que esto debería evitarse a favor de sudo lid -g {group}. Tengo un sistema donde esta respuesta enumera 8 usuarios en un grupo mientras que sudo lid -g {group}enumera 10.
DKroot

Vea la getentrespuesta de @Murray Jensen a continuación
scrutari

84

Prefiero usar el comando getent ...

Dado que getent utiliza el mismo servicio de nombres que el sistema, getent mostrará toda la información, incluida la obtenida de fuentes de información de red como LDAP.

Entonces, para un grupo, debe usar lo siguiente ...

getent group name_of_group

donde nombre_de_grupo se reemplaza con el grupo que desea buscar. Tenga en cuenta que esto solo devuelve membresías de grupo suplementarias, no incluye a los usuarios que tienen este grupo como su grupo principal.

Hay muchas otras búsquedas que puede hacer ... passwdsiendo otra útil, que necesitará para enumerar los grupos principales.


1
Las otras respuestas no se aplican si no es administrador y la información del grupo se almacena en otro servidor.
Andrés Alcarraz

1
Esto podría ser realmente confuso probablemente debido a la diferencia primaria / secundaria. Creo que esto debería evitarse a favor de sudo lid -g {group}. Tengo un sistema donde esta respuesta enumera 8 usuarios en un grupo mientras que sudo lid -g {group}enumera 10.
DKroot

12

Más fácil de hacer groups [username]

Si desea enumerar todos los usuarios locales y sus grupos locales, puede hacerlo

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

Si obtiene "grupos: comando no encontrado", es probable que haya editado su ruta ambiental para peor, para restablecer su ruta PATH=$(getconf PATH)


Funciona para un grupo particular si | grep {group}se agrega y da la respuesta correcta a diferencia de getent group name_of_groupogrep '^group_name_here:' /etc/group
DKroot

1
En lugar de cat /etc/passwd, debe usarlo gentent passwdpara que los usuarios en nis / ldap aún estén en la lista. El único inconveniente es que puede llevar bastante tiempo.
Brian Minton

8
groupmems -g nombregrupo -l

enumera todos los usuarios en el grupo nombrado.


Tenga en cuenta que groupmemses parte de las utilidades ocultas utilizadas en la mayoría de las distribuciones de Linux, sin embargo, groupmemsactualmente está ausente de Debian y sus derivados (un error ahora corregido pero no incluido en ninguna versión todavía (a partir de noviembre de 2016))
Stéphane Chazelas

2
También tenga en cuenta que groupmemssolo trata con grupos /etc/group(no los que están en LDAP u otra base de datos de usuarios) y requiere privilegios de superusuario cuando intenta abrir / etc / gshadow.
Stéphane Chazelas

A pesar de las advertencias mencionadas anteriormente, este comando es ideal para ciertas situaciones porque no requiere un análisis adicional de la salida (es decir, cuty amigos).
bonh

Esto podría ser realmente confuso probablemente debido a la diferencia primaria / secundaria. Creo que esto debe evitarse a favor de sudo lid -g {group}. Tengo un sistema donde esta respuesta enumera 8 usuarios en un grupo mientras que sudo lid -g {group}enumera 10.
DKroot

5

Me sorprende que nadie haya mencionado

id <user>

Este comando le dará una lista de grupos en los que se encuentra el usuario.


3
Porque, al contrario del título, el interlocutor quería conocer a los usuarios dentro de un grupo dado, no los grupos de un usuario dado, como se detalla en la pregunta. Ahora reformulé el título para que coincida con el contenido.
Dubu

Aaah, ya veo. Debería haber leído mejor el texto de la pregunta. Gracias.
Alex

4

groupsEl comando imprime membresías de grupo para un usuario. Puede usar el lidcomando para enumerar usuarios en un grupo como:

# lid -g <groupname>

44
lides parte de libuser, que no está instalado de manera predeterminada en muchas distribuciones.
Chris Down

2

OP formuló la pregunta para excluir la posibilidad de usar el comando de grupos . Como eso es parte de coreutils en Linux, (a) se eliminó o (b) OP está escribiendo mal el nombre.

OP podría haber usado groupsasí, por ejemplo:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

Una respuesta sugerida es solo grep para el nombre del grupo /etc/group. A veces eso funciona según lo previsto.

Un uso ligeramente mejor de grep tiene en cuenta la sintaxis de /etc/group:

group_name:password:GID:user_list

para que solo la parte anterior al primer colon sea un nombre de grupo válido. Un grep simple sin tener en cuenta la sintaxis puede (y lo hará) recoger coincidencias engañosas del archivo. Use expresiones regulares para hacer que grep coincida exactamente con lo que se necesita:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

o usando una variable de shell:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

Sin embargo, eso solo enumera aquellos que no están en un grupo predeterminado . Para añadir aquellos , es necesario tener en cuenta el archivo de contraseñas, por ejemplo, mediante la extracción del número de grupo-id de /etc/group, y la impresión de los usuarios cuyo grupo predeterminado de partidos /etc/passwd, por ejemplo,

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

Podría hacer lo mismo usando solo grep y sed, pero es más trabajo que usar awk.

Otra respuesta sugerida propuso usar getent, que también es probable que esté en una máquina Linux (con Debian, es parte de GNU libc). Sin embargo, una comprobación rápida de eso muestra que solo proporciona el /etc/groupcontenido.

Yo (como la mayoría) no tengo libusersni lidestoy instalado, por lo que no puedo comentar si cumple con las condiciones de OP.

También está el idprograma, que brinda información grupal. Alguien podría ampliar eso como una posible respuesta.


O simplemente, sed -n "s/^$groupname:.*://p" /etc/grouppero eso podría informar resultados incorrectos si el nombre del grupo contiene operadores RE ( .por ejemplo, no es raro en los nombres de grupo).
Stéphane Chazelas

GNU getenttambién consultará LDAP / NIS ... aunque posiblemente no cuando la enumeración esté explícitamente deshabilitada para la base de datos del grupo.
Stéphane Chazelas

Tenga en cuenta que groupsno ayudaría, ya que enumera los grupos de los que un usuario determinado es miembro en oposición a la lista de miembros de un grupo determinado.
Stéphane Chazelas

2

Funciona de maravilla:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

A diferencia de la respuesta aceptada de @ARG, este comando enumera a los usuarios que tienen <groupname> como su grupo principal
Bhavik

esta debería ser la respuesta aceptada
Nikolay Nenov

1
Estoy en desacuerdo. Debido a que lee a los usuarios en / etc / passwd, esto no funcionará con otros módulos nsswitch que accedan a LDAP, etc.
Ivan Vučica

No funcionó correctamente para mí: obtuve 4 miembros en un grupo, mientras que la sudo lid -glista es 8. @Bhavik La respuesta aceptada tampoco es correcta.
DKroot

2

Algunos le dirán que instale libuser (para 'lid') o miembros (para 'miembros'). Pero aprovechando la respuesta https://unix.stackexchange.com/a/349648/77959 que manejó este problema con la membresía del grupo de inicio de sesión , encontré que otro grupo no estaba cubierto por ese script. Entonces, aquí está lo mejor de ambos enfoques combinados:

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi

Funcionó correctamente en mi sistema a diferencia de las respuestas que involucran getento grep'^group_name_here:' /etc/group
DKroot

0

Esta modificación del enfoque user3717722 enumerará los miembros del grupo en una base de datos NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
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.