GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo obtener el nombre de usuario de uid

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.


Linux
  1. ¿Cómo obtener resultados de gdb.execute en PythonGDB (GDB 7.1)?

  2. Cómo obtener un proceso secundario del proceso principal

  3. ¿Cómo obtener el nombre de host de IP (Linux)?

  4. ¿Cómo obtener PID por nombre de proceso?

  5. ¿Cómo obtener máscara de red de bash?

¿Qué es UID en Linux, cómo encontrarlo y cambiarlo?

Cómo obtener noticias al instante desde la línea de comandos en Linux

Cómo obtener la lista de cuentas de usuario de MySQL en Linux

¿Cómo generar RSE desde WHM?

Cómo encontrar el nombre del proceso a partir de su PID

¿Cómo obtener el nombre de dominio en Windows usando el comando?