Come posso cercare un nome utente per ID in Linux?


67

Il comando idpuò essere utilizzato per cercare un utente uid, ad esempio:

$ id -u ubuntu
1000

Esiste un comando per cercare un nome utente da un uid? Mi rendo conto che questo può essere fatto guardando il /etc/passwdfile, ma sto chiedendo se esiste un comando esistente per questo, specialmente se l'utente che lo esegue non è root.

Non sto cercando il nome utente dell'utente corrente , ovvero non sto cercando whoamio logname.

Questo mi ha anche chiesto se sul web hosting condiviso questa è una funzione di sicurezza o non capisco qualcosa correttamente?

Per esame, il /etc/passwdfile da un host web condiviso:

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

Ed ecco un elenco di esempio di directory di /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

Possiamo vedere che rootè il proprietario di alcuni file e rootviene visualizzato anche in /etc/passwd, tuttavia gli altri utenti / gruppi vengono visualizzati come numeri.


6
Tieni presente che più di un utente può avere lo stesso UID. È raro, ma succede occasionalmente.
Barry Brown,

Risposte:


35

lsesegue già quella ricerca. È possibile eseguire una ricerca delle informazioni utente dalla riga di comando con getent passwd.

Se lsmostra un ID utente anziché un nome utente, è perché non esiste alcun utente con quel nome. I filesystem memorizzano gli ID utente, non i nomi utente. Se montate un filesystem da un altro sistema, o se un file appartiene a un utente ora cancellato, o se avete passato un ID utente numerico a chown, potete avere un file che appartiene a un ID utente che non ha un nome.

Su un host condiviso, potresti avere accesso ad alcuni file condivisi tra più macchine virtuali, ognuna con il proprio database utenti. Questo è un po 'strano (perché condividere file ma non gli utenti che li possiedono?), Ma è tecnicamente possibile.


2
Visualizzo il numero anziché il nome ls -lse il nome è più lungo di otto caratteri.
kgrittn,

@kgrittn Potrebbe dipendere dalla variante Unix. GNU ls mostra l'intero nome utente. BusyBox ls lo tronca a 8 caratteri (almeno sulla build che ho qui).
Gilles 'SO- smetti di essere cattivo'

66

Provare

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

Se questo non restituisce nulla, significa che non ho accesso per tradurre l'id in un nome utente?
Cwd,

1
Molto probabilmente non hai t set "$ uid" `o che non esiste. Lo grep ":$uid:" /etc/passwdtrova? Non getent passwdproduce alcun output?
Mikel,

@cwd: dovresti sempre avere accesso per tradurre un id in un nome utente. Ad esempio, lo ls -lfa sempre.
Camh

Solo curioso perché guardare un lselenco su un host condiviso stava mostrando i numeri nelle colonne del nome utente / gruppo con ls. Forse è una precauzione di sicurezza o una cosa jailshell?
Cwd,

@cwd Più probabilmente l'host condiviso sta usando un /etc/passwdmontato / condiviso da altrove che non era montato in quel momento.
jw013,

39

Potresti goderti questo piccolo ditty.

$ id -nu [number]

3.17.3-1-ARCH # 1 PREMETTO SMP ven 14 nov 22:56:01 CET 2014 i686 GNU / Linux

Posso confermare che restituisce un nome utente corrispondente, se presente, su Arch Linux. Posso anche confermare che non funziona su Ubuntu quando viene eseguito come utente normale, anche se non l'ho testato come superutente. Inoltre non funziona su Alpine Linux. Forse una funzione di sicurezza impedisce che funzioni su alcuni sistemi.


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

2
funziona per me, con id --version=id (GNU coreutils) 8.23
eMPee584,

Funziona anche con FreeBSD 10.3.
forquare,

nota: funziona su Red Hat / CentOS> = 7 (non su Red Hat / CentOS <= 6)
Franklin Piat

Cordiali saluti, questo non funziona con le immagini dockerbusbox / alpine linux / alpine docker
jjj

0

Mi rendo conto che questa è una vecchia domanda, ma ecco un'altra risposta

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

Pipe to grepwhat? (Inoltre, se aggiungi quattro spazi all'inizio della riga, verrà visualizzato come testo a larghezza fissa.)
Carattere jolly

Preferisco la risposta con getent passwd. Ma se si analizza / etc / passwd, sarebbe meglio usare 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

7
Diversamente getent, questo non funziona se il sistema utilizza LDAP.
Choroba,

3
questo non funziona né se viene utilizzato NIS o qualunque altro protocollo di autenticazione distribuito.
jlliagre,

@choroba: se avesse avuto un requisito specifico per LDAP o NIS, probabilmente lo avrebbe menzionato. La mia soluzione funziona su configurazioni linux tipiche.
laebshade,

2
perché non è affidabile (potrebbe corrispondere all'utente o al gruppo).
Franklin Piat,

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

4
Ciao NAIM. Anche se questa potrebbe essere una risposta corretta, aiuterebbe il richiedente (e molto probabilmente i futuri lettori della tua soluzione) se potessi modificare la tua risposta per spiegare brevemente come funziona.
roaima,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.