¿Cómo puedo buscar un nombre de usuario por id en Linux?


67

El comando idse puede usar para buscar un usuario uid, por ejemplo:

$ id -u ubuntu
1000

¿Hay un comando para buscar un nombre de usuario de a uid? Me doy cuenta de que esto se puede hacer mirando el /etc/passwdarchivo, pero estoy preguntando si existe un comando para esto, especialmente si el usuario que lo ejecuta no es root.

No estoy buscando el nombre de usuario del usuario actual , es decir, no estoy buscando whoamio logname.

Esto también me hizo preguntarme si en el alojamiento web compartido es una característica de seguridad, ¿o simplemente no estoy entendiendo algo correctamente?

Para su examen, el /etc/passwdarchivo de un servidor web compartido:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
avahi-autoipd:x:100:104:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
mailman:x:32006:32006::/usr/local/cpanel/3rdparty/mailman/mailman:/usr/local/cpanel/bin/noshell
dovecot:x:97:97:dovecot:/usr/libexec/dovecot:/sbin/nologin
mysql:x:101:105:MySQL server:/var/lib/mysql:/bin/bash
cpaneleximfilter:x:32007:32009::/var/cpanel/userhomes/cpaneleximfilter:/usr/local/cpanel/bin/noshell
nagios:x:102:106:nagios:/var/log/nagios:/bin/sh
ntp:x:38:38::/etc/ntp:/sbin/nologin
myuser:x:1747:1744::/home/myuser:/usr/local/cpanel/bin/jailshell

Y aquí hay un listado de directorio de muestra de /tmp/

drwx------  3 root     root        1024 Apr 16 02:09 spamd-22217-init/
drwxr-xr-x  2      665      664    1024 Apr  4 00:05 update-cache-44068ab4/
drwxr-xr-x  4      665      664    1024 Apr 17 15:17 update-extraction-44068ab4/
-rw-rw-r--  1      665      664   43801 Apr 17 15:17 variable.zip
-rw-r--r--  1      684      683    4396 Apr 17 07:01 wsdl-13fb96428c0685474db6b425a1d9baec

Podemos ver que rootes el propietario de algunos archivos y roottambién aparece en /etc/passwd, sin embargo, todos los demás usuarios / grupos se muestran como números.


66
Tenga en cuenta que más de un usuario puede tener el mismo UID. Es raro, pero sucede ocasionalmente.
Barry Brown

Respuestas:


35

lsYa realiza esa búsqueda. Puede realizar una búsqueda de información del usuario desde la línea de comandos con getent passwd.

Si lsmuestra una ID de usuario en lugar de un nombre de usuario, es porque no hay ningún usuario con ese nombre. Los sistemas de archivos almacenan ID de usuario, no nombres de usuario. Si monta un sistema de archivos desde otro sistema, o si un archivo pertenece a un usuario ahora eliminado, o si le pasó una ID de usuario numérica chown, puede tener un archivo que pertenece a una ID de usuario que no tiene un nombre.

En un host compartido, puede tener acceso a algunos archivos que se comparten entre varias máquinas virtuales, cada una con su base de datos de usuario. Esto es un poco extraño (¿por qué compartir archivos pero no los usuarios que los poseen?), Pero es técnicamente posible.


2
Estoy viendo el número en lugar del nombre ls -lsi el nombre tiene más de ocho caracteres de longitud.
kgrittn

@kgrittn Puede depender de la variante de Unix. GNU ls muestra el nombre de usuario completo. BusyBox ls lo trunca a 8 caracteres (al menos en la compilación que tengo aquí).
Gilles 'SO- deja de ser malvado'

66

Tratar

getent passwd "$uid" | cut -d: -f1

Si esto no devuelve nada, ¿eso significa que no tengo acceso para traducir la identificación a un nombre de usuario?
cwd

1
Es más probable que no haya t set "$ uid" `o que ese uid no exista. ¿Lo grep ":$uid:" /etc/passwdencuentra? ¿ getent passwdProduce alguna salida?
Mikel

@cwd: siempre debe tener acceso para traducir una identificación a un nombre de usuario. Por ejemplo, ls -lsiempre está haciendo esto.
camh

Es curioso porque mirar una lslista en un host compartido mostraba números en las columnas de nombre de usuario / grupo con ls. ¿Quizás es una precaución de seguridad o una cuestión de cárcel?
cwd

@cwd Es más probable que el host compartido esté usando un /etc/passwdmontado / compartido de otro lugar que no estaba montado en ese momento.
jw013

39

Podrías disfrutar de esta pequeña canción.

$ id -nu [number]

3.17.3-1-ARCH # 1 SMP PREEMPT Vie 14 de noviembre 22:56:01 CET 2014 i686 GNU / Linux

Puedo confirmar que devuelve un nombre de usuario correspondiente, si existe, en Arch Linux. También puedo confirmar que no funciona en Ubuntu cuando se ejecuta como un usuario normal, aunque no lo he probado como superusuario. Tampoco funciona en Alpine Linux. Tal vez una característica de seguridad evita que esto funcione en algunos sistemas.


id -u jimmij=> 1000. id -nu 1000=> id: 1000: no such user.
jimmij

2
funciona para mí, con id --version=id (GNU coreutils) 8.23
eMPee584

Funciona en FreeBSD 10.3 también.
forquare

nota: esto funciona en Red Hat / CentOS> = 7 (no en Red Hat / CentOS <= 6)
Franklin Piat

FYI esto no funciona en busybox / alpine linux / alpine docker images
jjj

0

Me doy cuenta de que esta es una vieja pregunta, pero aquí hay otra respuesta

awk -F: '{print $1,$3}' /etc/passwd | grep <UID>

¿Tubería a grepqué? (Además, si agrega cuatro espacios al comienzo de la línea, lo representará como texto de ancho fijo).
Comodín el

Prefiero la respuesta con getent passwd. Pero si analiza / etc / passwd, sería mejor usar solo awk ID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd.
Franklin Piat

-1

Parse / etc / passwd:

% awk -F: "/:$(id -u ubuntu):/{print \$1}" /etc/passwd
ubuntu

77
A diferencia getent, esto no funciona si el sistema usa LDAP.
choroba

3
esto no funciona si se usa NIS o cualquier otro protocolo de autenticación distribuido.
jlliagre

@ choroba: si tuviera un requisito específico para LDAP o NIS, probablemente lo habría mencionado. Mi solución funciona en configuraciones típicas de Linux.
laebshade

2
voto negativo porque no es confiable (podría coincidir con el usuario o el grupo).
Franklin Piat

-1
id | awk '{print $1}' | sed 's:.*(::;s:)$::'

44
Hola naim Si bien esta puede ser una respuesta correcta, ayudaría al autor de la pregunta (y posiblemente a los futuros lectores de su solución) si pudiera editar su respuesta para explicar brevemente cómo funciona esto.
Roaima
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.