Con GNU id
, puedes hacer:
id -un -- "$cheruid"
Eso consultará la base de datos de la cuenta (ya sea que esté almacenada en /etc/passwd
, LDAP, NIS+, un RDBMS...) para el primer nombre de usuario con ese uid.
Generalmente, solo hay un nombre de usuario por uid, pero eso no está garantizado, la clave en la base de datos de la cuenta de usuario es el nombre de usuario, no la identificación del usuario.
Si desea conocer todos los nombres de usuario de un uid determinado, puede hacerlo:
getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'
Pero eso puede no funcionar para algunas bases de datos de cuentas que no son enumerables (como a veces es el caso de los grandes basados en LDAP).
$ printf 'User is %s\n' "$( getent passwd 1001 | cut -d : -f 1 )"
User is myself
(hay un myself
usuario con UID 1001 en mi sistema)
Esto consultaría el passwd
base de datos para el UID dado, elimine el nombre de usuario de esa respuesta y use el resultado como argumento para printf
. Esto no funcionaría en macOS.
Para capturar UID desconocidos:
$ printf 'User is %s\n' "$( { getent passwd 1001 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is myself
$ printf 'User is %s\n' "$( { getent passwd 1002 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is UNKNOWN USER
Como una secuencia de comandos que toma cualquier número de UID en la línea de comando (con una salida ligeramente alterada):
#!/bin/sh
for uid do
printf 'User with UID %d is %s\n' "$uid" \
"$( { getent passwd "$uid" || echo 'NOT KNOWN'; } | cut -d : -f 1 )"
done
Prueba (esto pasaría por los UID de algunas cuentas de servicio en mi sistema OpenBSD):
$ sh ./script.sh {110..115}
User with UID 110 is _sndiop
User with UID 111 is NOT KNOWN
User with UID 112 is _syspatch
User with UID 113 is NOT KNOWN
User with UID 114 is NOT KNOWN
User with UID 115 is _slaacd
Ayuda con el shellscript original
La prueba en la declaración if está causando el problema. Sugiero el siguiente shellscript,
#!/bin/bash
read -p "donner l UID " cheruid
if [ "$(grep -w "^$cheruid" /etc/passwd)" != "" ]
then
grep -w "$cheruid" /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
echo "user not found"
fi
Edit1:agregué un ^
en la prueba para buscar solo coincidencias al principio de la línea.
Edit2:desde :
es un separador, puede eliminarlo y todo lo que sigue, y usar el resultado directamente en el echo
línea, si se acepta en la prueba, y simplifique el shellscript a
#!/bin/bash
read -p "donner l UID " cheruid
cheruid=${cheruid%%:*}
user=$(grep -wo "^$cheruid" /etc/passwd)
if [ "$user" != "" ]
then
echo "user is : $user"
else
echo "user not found"
fi
Esto te ayuda a hacer un buen bash shellscript.
Método eficiente y más general para encontrar ID de usuario con id
Si desea una forma eficiente de verificar si existe un nombre de usuario en particular, <test-name>
, puedes usar id
, como se indica en otra respuesta a su pregunta por Stéphane Chazelas:
id -un -- <test-name>
por ejemplo
id -un -- mehdi
id
encontrará no solo ID de usuario almacenados en /etc/passwd
pero también los administrados y almacenados de otras formas, por ejemplo LDAP, que es común en los sistemas de servidores profesionales como comenta Matteo Italia.
Si desea escanear a todos los usuarios
-
usuarios del sistema, en muchos sistemas Linux con números de usuario <1000
-
usuarios 'humanos', en muchos sistemas Linux con números de usuario>=1000
-
y asumiendo que todos los usuarios tienen un número <2000 (modifique si lo necesita)
puedes usar el siguiente bash
one-liner, que usa un bucle con id
,
for ((i=0;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done
Si desea ver solo los usuarios 'humanos' y asume que no se omite ningún número de ID de usuario (ningún usuario eliminado), el siguiente bash
oneliner es muy rápido,
i=1000;while true;do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$name" ;else break;fi;i=$((i+1));done
pero es más confiable asumir que algunos números de identificación pueden omitirse (usuarios eliminados),
for ((i=1000;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done
También hay users
y who
que imprimen los nombres de usuario de los usuarios actualmente conectados al host actual.