Wie kann ich unter Linux einen Benutzernamen anhand der ID suchen?

67

Der Befehl idkann zum Nachschlagen eines Benutzers verwendet werden uid, zum Beispiel:

$ id -u ubuntu
1000

Gibt es einen Befehl zum Nachschlagen eines Benutzernamens von a uid? Ich erkenne, dass dies getan werden kann, indem man sich die /etc/passwdDatei ansieht, aber ich frage, ob ein Befehl dafür vorhanden ist, besonders wenn der Benutzer, der ihn ausführt, nicht root ist.

Ich suche nicht nach dem Benutzernamen des aktuellen Benutzers, dh ich suche nicht whoamioder logname.

Das hat mich auch gefragt, ob es sich bei Shared Web Hosting um eine Sicherheitsfunktion handelt, oder verstehe ich einfach etwas nicht richtig?

Zur Überprüfung die /etc/passwdDatei von einem freigegebenen Webhost:

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

Und hier ist ein Beispielverzeichnis von /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

Wir können sehen, dass rootder Eigentümer einiger Dateien ist und rootauch in /etc/passwdangezeigt wird. Die anderen Benutzer / Gruppen werden jedoch alle als Zahlen angezeigt.

cwd
quelle
6
Beachten Sie, dass möglicherweise mehrere Benutzer dieselbe UID haben. Es ist selten, kommt aber gelegentlich vor.
Barry Brown

Antworten:

35

lsführt diese Suche bereits durch. Sie können eine Benutzerinformationssuche über die Befehlszeile mit ausführen getent passwd.

Wenn lsanstelle eines Benutzernamens eine Benutzer-ID angezeigt wird, liegt dies daran, dass kein Benutzer mit diesem Namen vorhanden ist. Dateisysteme speichern Benutzer-IDs, keine Benutzernamen. Wenn Sie ein Dateisystem von einem anderen System bereitstellen oder wenn eine Datei einem jetzt gelöschten Benutzer gehört oder wenn Sie eine numerische Benutzer-ID an übergeben haben chown, können Sie eine Datei haben, die zu einer Benutzer-ID gehört, die keinen Namen hat.

Auf einem gemeinsam genutzten Host haben Sie möglicherweise Zugriff auf einige Dateien, die von mehreren virtuellen Maschinen mit jeweils ihrer Benutzerdatenbank gemeinsam genutzt werden. Das ist etwas seltsam (warum Dateien freigeben, aber nicht die Benutzer, denen sie gehören?), Aber technisch möglich.

Gilles
quelle
2
Ich sehe die Nummer anstelle des Namens auf, ls -lwenn der Name länger als acht Zeichen ist.
Kgrittn
@kgrittn Das kann von der Unix-Variante abhängen. GNU ls zeigt den gesamten Benutzernamen an. BusyBox wird auf 8 Zeichen gekürzt (zumindest in dem Build, den ich hier habe).
Gilles
66

Versuchen

getent passwd "$uid" | cut -d: -f1
jw013
quelle
Wenn dies nichts zurückgibt, bedeutet das, dass ich keinen Zugriff habe, um die ID in einen Benutzernamen zu übersetzen?
KWD
1
Es ist wahrscheinlicher, dass Sie nicht t set "$ uid" haben oder dass diese UID nicht existiert. Findet grep ":$uid:" /etc/passwdes? Hat getent passwderzeugen eine Ausgabe?
Mikel
@cwd: Sie sollten immer Zugriff haben, um eine ID in einen Benutzernamen zu übersetzen. Zum Beispiel ls -lmacht das immer so.
am
Nur neugierig, weil beim Betrachten einer lsAuflistung auf einem gemeinsam genutzten Host Nummern in den Benutzer- / Gruppennamensspalten mit ls angezeigt wurden. Vielleicht ist es eine Sicherheits- oder Gefängnissache?
KWD
@cwd Wahrscheinlicher ist, dass der gemeinsam genutzte Host einen bereitgestellten /etc/passwd/ freigegebenen Host von einer anderen Stelle verwendet, die zu diesem Zeitpunkt noch nicht bereitgestellt war.
JW013
39

Sie könnten dieses kleine Liedchen genießen.

$ id -nu [number]

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

Ich kann bestätigen, dass unter Arch Linux ein entsprechender Benutzername zurückgegeben wird, falls einer existiert. Ich kann auch bestätigen, dass es unter Ubuntu nicht funktioniert, wenn es als normaler Benutzer ausgeführt wird, obwohl ich dies nicht als Superuser getestet habe. Es funktioniert auch nicht unter Alpine Linux. Möglicherweise verhindert eine Sicherheitsfunktion, dass dies auf einigen Systemen funktioniert.

Stefan
quelle
id -u jimmij=> 1000. id -nu 1000=> id: 1000: no such user.
Jimmy
2
funktioniert bei mir mit id --version=id (GNU coreutils) 8.23
eMPee584
Funktioniert auch in FreeBSD 10.3.
Forquare
Hinweis: Dies funktioniert unter Red Hat / CentOS> = 7 (nicht unter Red Hat / CentOS <= 6)
Franklin Piat
Zu Ihrer Information, dies funktioniert nicht bei Busybox- / Alpine Linux- / Alpine Docker-Bildern
jjj
0

Mir ist klar, dass dies eine alte Frage ist, aber hier ist eine andere Antwort

awk -F: '{print $1,$3}' /etc/passwd | grep <UID>
D Smith
quelle
Rohr zu grepwas? (Wenn Sie am Anfang der Zeile vier Leerzeichen einfügen, wird der Text als Text mit fester Breite gerendert.)
Platzhalter
Ich bevorzuge die Antwort mit getent passwd. Wenn Sie jedoch / etc / passwd analysieren, ist es besser, nur awk zu verwenden 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
laebshade
quelle
7
Im Gegensatz getentdazu funktioniert dies nicht, wenn das System LDAP verwendet.
Choroba
3
Dies funktioniert nicht, wenn NIS oder ein anderes verteiltes Authentifizierungsprotokoll verwendet wird.
Jlliagre
@choroba: Wenn er eine spezielle Anforderung für LDAP oder NIS hätte, hätte er diese wahrscheinlich erwähnt. Meine Lösung funktioniert mit typischen Linux-Setups.
Laebshade
2
Downvote, weil es nicht zuverlässig ist (es könnte entweder dem Benutzer oder der Gruppe entsprechen).
Franklin Piat
-1
id | awk '{print $1}' | sed 's:.*(::;s:)$::'
NAIM
quelle
4
Hallo NAIM. Dies mag zwar eine richtige Antwort sein, aber es würde dem Fragesteller (und möglicherweise zukünftigen Lesern Ihrer Lösung) helfen, wenn Sie Ihre Antwort bearbeiten könnten, um kurz zu erklären, wie dies funktioniert.
Roaima