Polecenia id
można użyć do wyszukania użytkownika uid
, na przykład:
$ id -u ubuntu 1000
Czy istnieje polecenie wyszukania nazwy użytkownika w uid
? Zdaję sobie sprawę, że można to zrobić, patrząc na plik /etc/passwd
, ale pytam, czy istnieje do tego polecenie, zwłaszcza jeśli wykonujący je użytkownik nie jest rootem.
Nie szukam nazwy użytkownika bieżącego użytkownika, tj. nie szukam whoami
ani logname
.
To również sprawiło, że zacząłem się zastanawiać, czy na współdzielonym hostingu internetowym jest to funkcja bezpieczeństwa, czy po prostu nie rozumiem czegoś poprawnie?
Do sprawdzenia, plik /etc/passwd
z 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 katalogu /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 root
jest właścicielem niektórych plików, a root
pojawia się również w /etc/passwd
, jednak inni użytkownicy / grupy są wyświetlani jako liczby .
Komentarze
- Należy pamiętać, że więcej niż jeden użytkownik może mieć ten sam UID. To ' jest rzadkie, ale zdarza się sporadycznie.
Odpowiedź
ls
już wykonuje to wyszukiwanie. Możesz wyszukać informacje o użytkowniku z wiersza poleceń za pomocą getent passwd
.
Jeśli ls
pokazuje identyfikator użytkownika zamiast nazwy użytkownika, ponieważ nie ma użytkownika o tej nazwie. Systemy plików przechowują identyfikatory użytkowników, a nie nazwy użytkowników. Jeśli zamontujesz system plików z innego systemu lub jeśli plik należy do usuniętego użytkownika, lub jeśli przekazałeś numeryczny identyfikator użytkownika do chown
, możesz mieć plik, który należy do identyfikatora użytkownika, który nie ma nazwy.
Na współdzielonym hoście możesz mieć dostęp do niektórych plików, które są współdzielone między kilkoma maszynami wirtualnymi, każda z ich 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.
Komentarze
- I ' m widzę numer zamiast nazwy na
ls -l
, jeśli nazwa ma więcej niż osiem znaków. - @kgrittn Może to zależeć w wariancie Unix. GNU ls pokazuje całą nazwę użytkownika. BusyBox ls skraca go do 8 znaków (przynajmniej w tej wersji, którą mam tutaj).
Odpowiedź
Spróbuj
getent passwd "$uid" | cut -d: -f1
Komentarze
- Jeśli to nic nie zwraca, oznacza to, że nie ' nie masz możliwości przetłumaczenia identyfikatora na nazwę użytkownika?
- Bardziej prawdopodobne jest, że nie
t set
” $ uid ” `lub ten identyfikator nie istnieje '. Czygrep ":$uid:" /etc/passwd
go znajduje? Czygetent passwd
generuje jakieś wyjście? - @cwd: Zawsze powinieneś mieć możliwość przetłumaczenia identyfikatora na nazwę użytkownika. Na przykład
ls -l
zawsze to robi. - Po prostu ciekawi, ponieważ patrząc na
ls
wpis na udostępnionym hoście wyświetlał liczby w kolumnach nazw użytkowników / grup z ls. Być może jest to środek ostrożności lub sprawa jailshell? - @cwd Bardziej prawdopodobne jest, że współdzielony host używa
/etc/passwd
zamontowanego / udostępnionego z innego miejsca, który nie był ' nie jest wtedy zamontowany.
Odpowiedź
Może ci się to trochę spodobać śpiewka.
$ 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 jest uruchamiany jako zwykły użytkownik, chociaż nie testowałem tego jako superużytkownik. Nie działa również w Alpine Linux. Być może funkcja bezpieczeństwa uniemożliwia to działanie w niektórych systemach.
Komentarze
-
id -u jimmij
= >1000
.id -nu 1000
= >id: 1000: no such user
. - działa dla mnie z
id --version
=id (GNU coreutils) 8.23
- Działa również we FreeBSD 10.3.
- uwaga: to działa w Red Hat / CentOS > = 7 (nie w Red Hat / CentOS < = 6)
- FYI to nie działa na obrazach busybox / alpine linux / alpine docker
Odpowiedź
Zdaję sobie sprawę, że to stare pytanie, ale oto inna odpowiedź
awk -F: "{print $1,$3}" /etc/passwd | grep <UID>
Komentarze
- potokiem do
grep
co? (Jeśli dodasz cztery spacje na początku wiersza, zostanie on wyrenderowany jako tekst o stałej szerokości). - Wolę odpowiedź z
getent passwd
. Ale jeśli przeanalizuję / etc / passwd, lepiej byłoby użyć tylko awkID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd
.
Odpowiedź
Przetwarzaj / etc / passwd:
% awk -F: "/:$(id -u ubuntu):/{print \$1}" /etc/passwd ubuntu
Komentarze
- W przeciwieństwie do
getent
, to nie działa, jeśli system korzysta z LDAP. - to nie ' nie działa również, jeśli NIS i s lub jakikolwiek inny rozproszony protokół uwierzytelniania.
- @choroba: gdyby miał określone wymagania dotyczące LDAP lub NIS, prawdopodobnie by o tym wspomniał. Moje rozwiązanie działa na typowych konfiguracjach Linuksa.
- głos negatywny, ponieważ ' nie jest wiarygodny (może pasować do użytkownika lub grupy).
Odpowiedź
id | awk "{print $1}" | sed "s/.*(//;s/)$//"
Ten oneliner wykonuje następujące czynności:
- pobierz informacje o użytkowniku
- wyodrębnij pierwszą kolumnę („uid = ID (NAZWA)”)
- usuń wszystko przed nawiasami, a także same nawiasy.
Odpowiedź
Polecenie id
może być użyte do oba do wyszukiwania identyfikatora UID i / lub nazwy UŻYTKOWNIKA
- wyszukaj UID użytkownika USER , na przykład:
$ id -u ubuntu 1000
- wyszukaj USER według UID , na przykład:
$ id -un 1000 ubuntu
Jeśli UID lub USER nie zostanie znaleziony na bieżącej maszynie, wypisze wiadomość, na przykład:
$ id -un 1234 id: 1234: no such user
From man id
:
id - print real and effective user and group IDs -n, --name print a name instead of a number, for -ugG -u, --user print only the effective user ID -g, --group print only the effective group ID -G, --groups print all group IDs