ฉันจะค้นหาชื่อผู้ใช้ด้วย ID ใน linux ได้อย่างไร?


67

คำสั่งidสามารถใช้เพื่อค้นหาผู้ใช้uidตัวอย่างเช่น:

$ id -u ubuntu
1000

มีคำสั่งให้ค้นหาชื่อผู้ใช้จาก a uidหรือไม่? ฉันรู้ว่าสิ่งนี้สามารถทำได้โดยดูที่/etc/passwdไฟล์ แต่ฉันถามว่ามีคำสั่งที่มีอยู่นี้หรือไม่โดยเฉพาะอย่างยิ่งหากผู้ใช้ที่เรียกใช้งานไม่รูท

ผมไม่ได้มองหาในปัจจุบันชื่อผู้ใช้ของผู้ใช้คือผมไม่ได้มองหาหรือwhoamilogname

นี่ทำให้ฉันสงสัยว่าในเว็บโฮสติ้งที่ใช้ร่วมกันนี้เป็นคุณลักษณะด้านความปลอดภัยหรือไม่หรือฉันไม่เข้าใจสิ่งที่ถูกต้อง

สำหรับการตรวจสอบ/etc/passwdไฟล์จากเว็บโฮสต์ที่แชร์:

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

และนี่คือตัวอย่างรายการไดเรกทอรีของ /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

เราสามารถเห็นได้ว่าrootเป็นเจ้าของไฟล์บางไฟล์และrootยังปรากฏในขึ้นมา/etc/passwdอย่างไรก็ตามผู้ใช้ / กลุ่มอื่น ๆ ทั้งหมดแสดงเป็นตัวเลข


6
โปรดทราบว่าผู้ใช้มากกว่าหนึ่งรายอาจมี UID เดียวกัน มันหายาก แต่เกิดขึ้นเป็นครั้งคราว
Barry Brown เมื่อ

คำตอบ:


35

lsดำเนินการค้นหานั้นแล้ว getent passwdคุณสามารถดำเนินการค้นหาข้อมูลของผู้ใช้จากบรรทัดคำสั่งด้วย

หากlsแสดง ID ผู้ใช้แทนชื่อผู้ใช้นั่นเป็นเพราะไม่มีชื่อผู้ใช้ ระบบไฟล์เก็บ ID ผู้ใช้ไม่ใช่ชื่อผู้ใช้ หากคุณเมาท์ระบบไฟล์จากระบบอื่นหรือถ้าไฟล์เป็นของผู้ใช้ที่ถูกลบตอนนี้หรือถ้าคุณส่ง ID ผู้ใช้ที่เป็นตัวเลขไปให้chownคุณสามารถมีไฟล์ที่เป็นของ ID ผู้ใช้ที่ไม่มีชื่อ

บนโฮสต์ที่ใช้ร่วมกันคุณอาจเข้าถึงไฟล์บางไฟล์ที่ใช้ร่วมกันระหว่างเครื่องเสมือนหลายเครื่องแต่ละเครื่องมีฐานข้อมูลผู้ใช้ นี่เป็นเรื่องแปลก (ทำไมแชร์ไฟล์ แต่ไม่ใช่ผู้ใช้ที่เป็นเจ้าของมัน) แต่เป็นไปได้ในทางเทคนิค


2
ฉันเห็นหมายเลขแทนที่จะใช้ชื่อls -lถ้าชื่อยาวเกินแปดอักขระ
kgrittn

@kgrittn มันอาจขึ้นอยู่กับตัวแปร Unix GNU ls แสดงชื่อผู้ใช้ทั้งหมด BusyBox ls ตัดให้เหลือ 8 ตัวอักษร (อย่างน้อยบนบิลด์ที่ฉันมี)
Gilles

66

ลอง

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

หากสิ่งนี้ไม่ได้หมายความว่าฉันไม่มีสิทธิ์เข้าถึงในการแปล ID เป็นชื่อผู้ใช้ใช่ไหม
cwd

1
มีโอกาสมากที่คุณไม่ได้t set "$ uid" `หรือไม่มี uid นั้น ไม่grep ":$uid:" /etc/passwdพบมันได้หรือไม่ ไม่getent passwdผลิตออกใด ๆ
มิเคล

@cwd: คุณควรมีสิทธิ์เข้าถึงการแปล ID เป็นชื่อผู้ใช้ ตัวอย่างเช่นls -lทำสิ่งนี้อยู่เสมอ
camh

เพียงแค่อยากรู้เพราะการดูlsรายการบนโฮสต์ที่ใช้ร่วมกันแสดงตัวเลขในคอลัมน์ชื่อผู้ใช้ / กลุ่มด้วย ls บางทีมันเป็นข้อควรระวังด้านความปลอดภัยหรือการคุมขัง?
cwd

@cwd มีโอกาสมากที่โฮสต์ที่แชร์จะใช้/etc/passwdเมานต์ / แบ่งใช้จากที่อื่นซึ่งไม่ได้เมานต์ในเวลานั้น
jw013

39

คุณอาจจะสนุกกับเพลงเล็ก ๆ น้อย ๆ นี้

$ id -nu [number]

3.17.3-1-ARCH # 1 SMP PREEMPT ศุกร์ 14 พ.ย. 22:56:01 CET 2014 i686 GNU / Linux

ฉันสามารถยืนยันได้ว่ามันคืนชื่อผู้ใช้ที่สอดคล้องกันหากมีอยู่บน Arch Linux ฉันยังสามารถยืนยันได้ว่ามันไม่ทำงานบน Ubuntu เมื่อทำงานในฐานะผู้ใช้ปกติแม้ว่าฉันจะไม่ได้ทดสอบสิ่งนี้ในฐานะ superuser มันไม่ทำงานบน Alpine Linux บางทีคุณลักษณะด้านความปลอดภัยจะป้องกันไม่ให้สิ่งนี้ทำงานบนบางระบบ


id -u jimmij1000=> =>id -nu 1000 id: 1000: no such user
jimmij

2
ใช้ได้กับฉันด้วยid --version=id (GNU coreutils) 8.23
eMPee584

ทำงานใน FreeBSD 10.3 ได้เช่นกัน
forquare

หมายเหตุ: ใช้งานได้กับ Red Hat / CentOS> = 7 (ไม่ใช่ Red Hat / CentOS <= 6)
Franklin Piat

FYI สิ่งนี้ไม่สามารถใช้งานได้บน busybox / alpine linux / alpine docker images
jjj

0

ฉันรู้ว่านี่เป็นคำถามเก่า แต่นี่เป็นคำตอบอื่น

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

ท่อเพื่อgrepอะไร (เช่นถ้าคุณเพิ่มช่องว่างสี่จุดที่จุดเริ่มต้นของบรรทัดก็จะทำให้มันเป็นข้อความความกว้างคงที่)
Wildcard

getent passwdฉันชอบคำตอบกับ แต่ถ้าแยก / etc / passwd มันจะดีกว่าที่จะใช้ awk ID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwdเท่านั้น
Franklin Piat

-1

แยก / etc / passwd:

% awk -F: "/:$(id -u ubuntu):/{print \$1}" /etc/passwd
ubuntu

7
ไม่เหมือนกับgetentสิ่งนี้จะไม่ทำงานหากระบบใช้ LDAP
choroba

3
สิ่งนี้จะไม่ทำงานหากใช้ NIS หรือโปรโตคอลการตรวจสอบสิทธิ์แบบกระจายอื่น ๆ
jlliagre

@choroba: ถ้าเขามีข้อกำหนดเฉพาะสำหรับ LDAP หรือ NIS เขาอาจจะกล่าวถึงมัน โซลูชันของฉันทำงานกับการตั้งค่า linux ทั่วไป
laebshade

2
เพราะมันไม่น่าเชื่อถือ (สามารถจับคู่กับผู้ใช้หรือกลุ่ม)
Franklin Piat

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

4
สวัสดี NAIM แม้ว่านี่อาจเป็นคำตอบที่ถูกต้อง แต่ก็จะช่วยให้ผู้ถาม (และอาจเป็นผู้อ่านโซลูชันของคุณในอนาคต) หากคุณสามารถแก้ไขคำตอบของคุณเพื่ออธิบายสั้น ๆ ว่ามันทำงานอย่างไร
roaima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.