Se supone que debo escribir un script de shell que hará eco de los nombres de usuario de los usuarios cuyo grupo principal es igual al grupo cuya identificación es el argumento de la línea de comando.
Respuesta1
Ya que estás haciendo la búsqueda por GID, no por gruponombre, y solo te interesa elprimarioGID para cada usuario, esto es trivialmente fácil con Awk.
El formato de /etc/passwd
se describe en man 5 passwd
. Para citar la página de manual:
There is one entry per line, and each line has the format:
account:password:UID:GID:GECOS:directory:shell
Entonces desea imprimir el primer campo para cada línea dondecuatroEl campo es lo que se pasa a su secuencia de comandos. Donde los "campos" están delimitados por dos puntos.
Personalmente, no me molestaría en crear un guión para esto; Usaría una función de shell. Ver:
Entonces todo lo que necesitas es:
- Una comprensión de la
-F
opción para Awk - Una comprensión básica de la sintaxis de Awk, que es
condition {action}
- Comprensión de cómo hacer referencia a campos cuando se usa Awk, y
- Será útil si comprende cómo pasar variables de shell a Awk; Mire la
-v
opción de Awk.
Consulte la página de manual de Awk para obtener estos puntos.
No haré tu tarea por ti; el punto es aprender acódigo, no aprender a copiar y pegar. Pero si te quedas atascado en esto, comenta esta pregunta. Puedo agregar un poco más de detalle si es necesario. (Y en aproximadamente una semana podré actualizar para incluir una solución completa).
Nota al margen: en el mundo real, como puede ver en las otras respuestas, hay mucha más complejidad asociada con la búsqueda de usuarios. Hay muchas formas diferentes de almacenar usuarios, y tener en cuenta esas complejidades puede ser...complejo.
Pero su pregunta parece ser una tarea hecha a medida para realizarse fácilmente con Awk, y al mismo tiempo ser una aplicación realista que sería útil en el mundo real.
Respuesta2
Eso no siempre es posible porque las bases de datos de los usuarios no siempre son enumerables.
En la passwd
base de datos ( /etc/passwd
, LDAP, mysql, NIS+, etc. o una combinación), la clave principal es el nombre de usuario. (varios usuarios pueden tener el mismo uid, posiblemente con diferentes gids).
Siempre puede consultar la base de datos de usuarios para un nombre de usuario determinado, pero no siempre puede recuperar la lista completa de usuarios.
Puedes probar. No existe un comando estándar para eso, pero muchos sistemas tienen un getent
comando que quizás puedas usar.
getent passwd
Devolverá la lista de usuarios como csv (separado por dos puntos). El primer campo es el nombre de usuario y el cuarto el gid principal. Entonces, si conoce el gid, puede devolver fácilmente la lista de usuarios que usan awk
.
getent -- group "$group"
Consultará la base de datos del grupo para lo dado $group
y devolverá una línea de csv donde el tercer campo es el gid. cut
sería suficiente para extraerlo.
Si la base de datos de usuarios no es enumerable, es posible que desee intentar consultar cada número de uid posible individualmente (tenga cuidado con que algunos sistemas admiten uids de hasta 2 31 ), pero aun así no se garantiza que se devuelvan todos los usuarios posibles, ya que puede haber más de uno. usuario por uid, y las consultas de la base de datos de contraseñas generalmente devuelven solo un usuario.
Respuesta3
#!/bin/sh
if [ $# -ne 1 ]
then
echo "Usage: $0 gid"
exit 1
fi
getent passwd | awk -F: -v pgid=$gid '$4 == pgid { print $1 }'
Después de verificar la existencia de un parámetro, el script consulta la base de datos del usuario ( getent passwd
) usando awk para verificar el cuarto campo (ID del grupo principal) con el ID del grupo principal de la base de datos del grupo. Si una línea (entrada de usuario) coincide, imprime el primer campo (nombre de usuario).