Làm cách nào để tìm tên người dùng theo id trong linux?


67

Lệnh idcó thể được sử dụng để tra cứu người dùng uid, ví dụ:

$ id -u ubuntu
1000

Có một lệnh để tra cứu tên người dùng từ một uid? Tôi nhận ra điều này có thể được thực hiện bằng cách xem /etc/passwdtệp nhưng tôi đang hỏi liệu đã có lệnh nào để thực hiện việc này chưa, đặc biệt nếu người dùng thực thi nó không phải là root.

Tôi không tìm kiếm tên người dùng hiện tại , tức là tôi không tìm kiếm whoamihoặc logname.

Điều này cũng làm cho tôi tự hỏi nếu trên chia sẻ lưu trữ web đây là một tính năng bảo mật, hoặc tôi chỉ không hiểu một cái gì đó chính xác?

Để kiểm tra, /etc/passwdtệp từ máy chủ web được chia sẻ:

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

Và đây là một danh sách thư mục mẫu của /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

Chúng ta có thể thấy rootlà chủ sở hữu của một số tệp và rootcũng đang hiển thị /etc/passwd, tuy nhiên những người dùng / nhóm khác đều hiển thị dưới dạng số.


6
Hãy nhớ rằng nhiều người dùng có thể có cùng UID. Nó hiếm, nhưng thỉnh thoảng xảy ra.
Barry Brown

Câu trả lời:


35

lsđã thực hiện tra cứu đó. Bạn có thể thực hiện tra cứu thông tin người dùng từ dòng lệnh với getent passwd.

Nếu lshiển thị ID người dùng thay vì tên người dùng, thì đó là vì không có người dùng theo tên đó. Hệ thống tập tin lưu trữ ID người dùng, không phải tên người dùng. Nếu bạn gắn hệ thống tệp từ một hệ thống khác hoặc nếu một tệp thuộc về người dùng hiện đã bị xóa hoặc nếu bạn đã chuyển ID người dùng số sang chown, bạn có thể có một tệp thuộc về ID người dùng không có tên.

Trên máy chủ được chia sẻ, bạn có thể có quyền truy cập vào một số tệp được chia sẻ giữa một số máy ảo, mỗi máy có cơ sở dữ liệu người dùng của chúng. Điều này hơi lạ (tại sao chia sẻ tệp nhưng không phải người dùng sở hữu chúng?), Nhưng về mặt kỹ thuật là có thể.


2
Tôi đang nhìn thấy số thay vì tên trên ls -lnếu tên dài hơn tám ký tự.
kgrittn

@kgrittn Nó có thể phụ thuộc vào biến thể Unix. GNU ls hiển thị toàn bộ tên người dùng. BusyBox ls cắt nó thành 8 ký tự (ít nhất là trên bản dựng tôi có ở đây).
Gilles

66

Thử

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

Nếu điều này trả về không có nghĩa là tôi không có quyền truy cập để dịch id sang tên người dùng?
cwd

1
Nhiều khả năng bạn đã không t set "$ uid" `hoặc uid không tồn tại. Có grep ":$uid:" /etc/passwdtìm thấy nó không? Có getent passwdsản xuất bất kỳ đầu ra?
Mikel

@cwd: Bạn phải luôn có quyền truy cập để dịch id sang tên người dùng. Ví dụ, ls -lluôn luôn làm điều này.
camh

Chỉ tò mò vì nhìn vào một lsdanh sách trên một máy chủ được chia sẻ đã hiển thị số trong các cột tên người dùng / nhóm với ls. Có lẽ đó là một biện pháp phòng ngừa an ninh hoặc điều tù tội?
cwd

@cwd Nhiều khả năng máy chủ được chia sẻ đang sử dụng /etc/passwdgắn kết / chia sẻ từ nơi khác không được gắn vào thời điểm đó.
jw013

39

Bạn có thể thưởng thức ditty nhỏ này.

$ id -nu [number]

3.17.3-1-ARCH # 1 SMP PREEMPT Thứ Sáu, ngày 14 tháng 11 22:56:01 CET 2014 i686 GNU / Linux

Tôi có thể xác nhận rằng nó trả về một tên người dùng tương ứng, nếu có, trên Arch Linux. Tôi cũng có thể xác nhận rằng nó không hoạt động trên Ubuntu khi chạy như một người dùng bình thường, mặc dù tôi chưa thử nghiệm nó như là siêu người dùng. Nó cũng không hoạt động trên Alpine Linux. Có thể một tính năng bảo mật ngăn điều này hoạt động trên một số hệ thống.


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

2
hoạt động với tôi, với id --version=id (GNU coreutils) 8.23
eMPee584

Hoạt động trong FreeBSD 10.3 cũng có.
forapes

lưu ý: điều này hoạt động trên Red Hat / CentOS> = 7 (không phải trên Red Hat / CentOS <= 6)
Franklin Piat

FYI này không hoạt động trên hình ảnh
docker

0

Tôi nhận ra đây là một câu hỏi cũ, nhưng đây là một câu trả lời khác

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

Ống để làm grepgì? (Ngoài ra nếu bạn thêm bốn khoảng trắng ở đầu dòng, nó sẽ hiển thị dưới dạng văn bản có chiều rộng cố định.)
Wildcard

Tôi thích câu trả lời với getent passwd. Nhưng nếu phân tích cú pháp / etc / passwd, sẽ tốt hơn nếu chỉ sử dụng awk ID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd.
Franklin Piat

-1

Phân tích cú pháp / etc / passwd:

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

7
Không giống như getent, điều này không hoạt động nếu hệ thống sử dụng LDAP.
choroba

3
điều này không hoạt động nếu NIS được sử dụng hoặc bất kỳ giao thức xác thực phân tán nào khác.
jlliagre

@choroba: nếu anh ta có một yêu cầu cụ thể về LDAP hoặc NIS, có lẽ anh ta đã đề cập đến nó. Giải pháp của tôi hoạt động trên các thiết lập linux điển hình.
laebshade

2
downvote vì nó không đáng tin cậy (nó có thể phù hợp với người dùng hoặc nhóm).
Franklin Piat

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

4
Xin chào NAIM. Mặc dù đây có thể là một câu trả lời đúng nhưng nó sẽ giúp người hỏi (và rất có thể là những người đọc tương lai về giải pháp của bạn) nếu bạn có thể chỉnh sửa câu trả lời của mình để giải thích ngắn gọn cách thức hoạt động của nó.
roaima
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.