Jak mogę wyszukać nazwę użytkownika według ID w systemie Linux?

67

Polecenia idmożna użyć do wyszukania użytkownika uid, na przykład:

$ id -u ubuntu
1000

Czy istnieje polecenie wyszukania nazwy użytkownika z uid? Zdaję sobie sprawę, że można to zrobić, patrząc na /etc/passwdplik, ale pytam, czy istnieje do tego polecenie, szczególnie jeśli użytkownik wykonujący go nie jest rootem.

Nie szukam nazwy użytkownika bieżącego użytkownika, tj. Nie szukam whoamiani logname.

To sprawiło, że zastanawiałem się, czy na współdzielonym hostingu jest to funkcja bezpieczeństwa, czy po prostu coś nie rozumiem?

Do sprawdzenia /etc/passwdplik udostępnionego hosta internetowego:

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

A oto przykładowa lista katalogów /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

Widzimy, że rootjest właścicielem niektórych plików, a roottakże pojawia się w /etc/passwd, ale wszyscy inni użytkownicy / grupy pojawiają się jako liczby.

cwd
źródło
6
Pamiętaj, że więcej niż jeden użytkownik może mieć ten sam identyfikator UID. To rzadkie, ale zdarza się czasami.
Barry Brown,

Odpowiedzi:

35

lsjuż wykonuje to wyszukiwanie. Możesz wykonać wyszukiwanie informacji o użytkowniku z wiersza poleceń za pomocą getent passwd.

Jeśli lspokazuje nazwę użytkownika zamiast nazwy użytkownika, to dlatego, że nie ma użytkownika o tej nazwie. Systemy plików przechowują identyfikatory użytkowników, a nie nazwy użytkowników. Jeśli podłączysz system plików z innego systemu lub jeśli plik należy do usuniętego użytkownika lub jeśli przekazałeś mu numeryczny identyfikator użytkownika chown, możesz mieć plik należący do identyfikatora użytkownika, który nie ma nazwy.

Na wspólnym hoście możesz mieć dostęp do niektórych plików, które są współużytkowane przez kilka maszyn wirtualnych, każda z bazą danych użytkowników. To trochę dziwne (po co udostępniać pliki, ale nie użytkownikom, którzy są ich właścicielami?), Ale jest to technicznie możliwe.

Gilles
źródło
2
Widzę numer zamiast nazwy, ls -ljeśli nazwa ma ponad osiem znaków długości.
kgrittn
@kgrittn Może to zależeć od wariantu Uniksa. GNU ls pokazuje całą nazwę użytkownika. BusyBox ls obcina go do 8 znaków (przynajmniej w wersji, którą mam tutaj).
Gilles
66

Próbować

getent passwd "$uid" | cut -d: -f1
jw013
źródło
Jeśli to nic nie zwraca, to znaczy, że nie mam dostępu do przetłumaczenia identyfikatora na nazwę użytkownika?
cwd
1
Bardziej prawdopodobne jest, że t set „$ uid” nie istnieje lub ten identyfikator użytkownika nie istnieje. Czy grep ":$uid:" /etc/passwdto znajduje? Czy getent passwdprodukuje jakąkolwiek produkcję?
Mikel
@cwd: Zawsze powinieneś mieć dostęp do przetłumaczenia identyfikatora na nazwę użytkownika. Na przykład ls -lzawsze to robi.
camh
Ciekawe, bo patrząc na lswpis na wspólnym hoście, pokazywał liczby w kolumnach nazw użytkowników / grup za pomocą ls. Być może jest to środek bezpieczeństwa lub jailshell?
cwd
@cwd Bardziej prawdopodobne jest, że host współdzielony używa /etc/passwdmontowanego / współdzielonego z innego miejsca, które nie było wówczas montowane.
jw013
39

Może spodoba ci się ta mała ditty.

$ id -nu [number]

3.17.3-1-ARCH # 1 SMP PREEMPT Pt 14 listopada 22:56:01 CET 2014 i686 GNU / Linux

Mogę potwierdzić, że zwraca odpowiednią nazwę użytkownika, jeśli taka istnieje, w Arch Linux. Mogę również potwierdzić, że nie działa na Ubuntu, gdy działa jako zwykły użytkownik, chociaż nie przetestowałem tego jako superużytkownika. Nie działa również w systemie Alpine Linux. Być może funkcja zabezpieczeń uniemożliwia to działanie w niektórych systemach.

Stefan
źródło
id -u jimmij=> 1000. id -nu 1000=> id: 1000: no such user.
jimmij
2
działa dla mnie, z id --version=id (GNU coreutils) 8.23
eMPee584
Działa również w FreeBSD 10.3.
forquare
Uwaga: Działa to na Red Hat / CentOS> = 7 (nie na Red Hat / CentOS <= 6)
Franklin Piat
FYI nie działa na obrazach busybox / alpine linux / alpine docker
jjj
0

Zdaję sobie sprawę, że to stare pytanie, ale oto kolejna odpowiedź

awk -F: '{print $1,$3}' /etc/passwd | grep <UID>
D Smith
źródło
Rura do grepczego? (Również jeśli dodasz cztery spacje na początku wiersza, będzie to renderowane jako tekst o stałej szerokości.)
Wildcard
Wolę odpowiedź z getent passwd. Ale jeśli parsujemy / etc / passwd, korzystniej byłoby użyć tylko awk ID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd.
Franklin Piat
-1

Analizuj / etc / passwd:

% awk -F: "/:$(id -u ubuntu):/{print \$1}" /etc/passwd
ubuntu
laebshade
źródło
7
W przeciwieństwie do getenttego nie działa, jeśli system używa LDAP.
choroba
3
nie działa to, jeśli używany jest NIS lub jakikolwiek inny protokół uwierzytelniania rozproszonego.
jlliagre
@choroba: gdyby miał określone wymagania dotyczące LDAP lub NIS, prawdopodobnie by o tym wspomniał. Moje rozwiązanie działa na typowych konfiguracjach systemu Linux.
laebshade
2
głosuj, ponieważ nie jest wiarygodny (może pasować do użytkownika lub grupy).
Franklin Piat
-1
id | awk '{print $1}' | sed 's:.*(::;s:)$::'
NAIM
źródło
4
Cześć NAIM. Chociaż może to być poprawna odpowiedź, pomógłby pytającemu (i być może przyszłym czytelnikom twojego rozwiązania), gdybyś mógł edytować swoją odpowiedź, aby krótko wyjaśnić, jak to działa.
roaima