Bagaimana saya bisa mencari nama pengguna dengan id di linux?

67

Perintah iddapat digunakan untuk mencari pengguna uid, misalnya:

$ id -u ubuntu
1000

Apakah ada perintah untuk mencari nama pengguna dari uid? Saya menyadari ini bisa dilakukan dengan melihat /etc/passwdfile tetapi saya bertanya apakah ada perintah yang ada untuk ini, terutama jika pengguna yang mengeksekusinya bukan root.

Saya tidak mencari nama pengguna pengguna saat ini, yaitu saya tidak mencari whoamiatau logname.

Ini juga membuat saya bertanya-tanya apakah pada shared hosting web ini adalah fitur keamanan, atau apakah saya hanya tidak memahami sesuatu dengan benar?

Untuk pemeriksaan, /etc/passwdfile dari host web bersama:

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

Dan di sini adalah daftar contoh direktori /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

Kita dapat melihat rootadalah pemilik beberapa file, dan rootjuga muncul di /etc/passwd, namun semua pengguna / grup lainnya muncul sebagai angka.

cwd
sumber
6
Ingatlah bahwa lebih dari satu pengguna mungkin memiliki UID yang sama. Jarang, tetapi kadang-kadang terjadi.
Barry Brown

Jawaban:

35

lssudah melakukan pencarian itu. Anda dapat melakukan pencarian informasi pengguna dari baris perintah dengan getent passwd.

Jika lsmenampilkan ID pengguna alih-alih nama pengguna, itu karena tidak ada pengguna dengan nama itu. Filesystem menyimpan ID pengguna, bukan nama pengguna. Jika Anda memasang sistem file dari sistem lain, atau jika file milik pengguna yang sekarang dihapus, atau jika Anda memberikan ID pengguna numerik chown, Anda dapat memiliki file milik ID pengguna yang tidak memiliki nama.

Pada host bersama, Anda mungkin memiliki akses ke beberapa file yang dibagi antara beberapa mesin virtual, masing-masing dengan database penggunanya. Ini agak aneh (mengapa berbagi file tetapi bukan pengguna yang memilikinya?), Tetapi secara teknis memungkinkan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Saya melihat nomor alih-alih nama pada ls -ljika nama panjangnya lebih dari delapan karakter.
kgrittn
@ kgrittn Mungkin tergantung pada varian Unix. GNU ls menunjukkan seluruh nama pengguna. BusyBox ls memotongnya menjadi 8 karakter (setidaknya pada build yang saya miliki di sini).
Gilles 'SO- berhenti menjadi jahat'
66

Mencoba

getent passwd "$uid" | cut -d: -f1
jw013
sumber
Jika ini tidak menghasilkan apa-apa, itu berarti saya tidak memiliki akses untuk menerjemahkan id ke nama pengguna?
cwd
1
Kemungkinan besar Anda tidak t set "$ uid" `atau uid itu tidak ada. Apakah grep ":$uid:" /etc/passwdmenemukannya? Apakah getent passwdmenghasilkan output?
Mikel
@ cwd: Anda harus selalu memiliki akses untuk menerjemahkan id ke nama pengguna. Misalnya, ls -lselalu melakukan ini.
camh
Hanya ingin tahu karena melihat lsdaftar pada host bersama menunjukkan angka di kolom nama pengguna / grup dengan ls. Mungkin itu tindakan pencegahan keamanan atau penjara?
cwd
@cwd Kemungkinan besar host bersama menggunakan /etc/passwdmount / dibagi dari tempat lain yang tidak di-mount pada saat itu.
jw013
39

Anda mungkin menikmati lagu pendek ini.

$ id -nu [number]

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

Saya dapat mengkonfirmasi bahwa itu mengembalikan nama pengguna yang sesuai, jika ada, di Arch Linux. Saya juga dapat mengkonfirmasi bahwa itu tidak berfungsi di Ubuntu ketika dijalankan sebagai pengguna normal, meskipun saya belum menguji ini sebagai superuser. Ini juga tidak berfungsi di Alpine Linux. Mungkin fitur keamanan mencegah ini bekerja pada beberapa sistem.

Stefan
sumber
id -u jimmij=> 1000. id -nu 1000=> id: 1000: no such user.
jimmij
2
bekerja untuk saya, dengan id --version=id (GNU coreutils) 8.23
eMPee584
Berfungsi di FreeBSD 10.3 juga.
forquare
catatan: ini bekerja pada Red Hat / CentOS> = 7 (bukan pada Red Hat / CentOS <= 6)
Franklin Piat
FYI ini tidak berfungsi pada busybox / alpine linux / alpine docker images
jjj
0

Saya menyadari ini adalah pertanyaan lama, tetapi inilah jawaban lain

awk -F: '{print $1,$3}' /etc/passwd | grep <UID>
D Smith
sumber
Pipa untuk grepapa? (Juga jika Anda menambahkan empat spasi di awal baris, itu akan menjadikannya sebagai teks dengan lebar tetap.)
Wildcard
Saya lebih suka jawabannya dengan getent passwd. Tetapi jika parsing / etc / passwd, akan lebih baik menggunakan awk saja 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
sumber
7
Tidak seperti getentini, ini tidak berfungsi jika sistem menggunakan LDAP.
choroba
3
ini tidak berfungsi baik jika NIS digunakan atau protokol otentikasi terdistribusi apa pun lainnya.
jlliagre
@ choroba: jika dia memiliki persyaratan khusus untuk LDAP atau NIS, dia mungkin akan menyebutkannya. Solusi saya bekerja pada pengaturan linux yang khas.
laebshade
2
downvote karena ini tidak dapat diandalkan (bisa cocok dengan pengguna atau grup).
Franklin Piat
-1
id | awk '{print $1}' | sed 's:.*(::;s:)$::'
NAIM
sumber
4
Halo NAIM. Meskipun ini mungkin jawaban yang benar, itu akan membantu penanya (dan kemungkinan besar pembaca masa depan dari solusi Anda) jika Anda dapat mengedit jawaban Anda untuk menjelaskan secara singkat bagaimana ini bekerja.
roaima