如何在Linux中按ID查找用户名?


67

该命令id可用于查找用户的uid,例如:

$ id -u ubuntu
1000

是否有命令从中查找用户名uid?我意识到可以通过查看/etc/passwd文件来完成此操作,但是我在询问是否有对此的现有命令,尤其是如果执行该文件的用户不是root用户。

我不是在寻找当前用户的用户名,即我不是在寻找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。它很少见,但偶尔会发生。
巴里·布朗

Answers:


35

ls已经执行了该查找。您可以使用在命令行中执行用户信息查找getent passwd

如果ls显示用户ID而不是用户名,那是因为该名称没有用户。文件系统存储用户ID,而不存储用户名。如果您从另一个系统挂载文件系统,或者文件属于已删除的用户,或者将数字用户ID传递给chown,则您可以拥有一个文件,该文件属于没有名称的用户ID。

在共享主机上,您可以访问在多个虚拟机之间共享的某些文件,每个虚拟机都具有其用户数据库。这有点奇怪(为什么共享文件,而不共享文件的用户?),但是从技术上讲是可行的。


2
ls -l如果名称超过八个字符,我会看到数字而不是名称。
kgrittn

@kgrittn它可能取决于Unix变体。GNU ls显示整个用户名。BusyBox ls会将其截断为8个字符(至少在我在此处具有的版本上)。
吉尔斯

66

尝试

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

如果未返回任何内容,是否表示我无权将ID转换为用户名?
cwd 2012年

1
您更有可能执行了t set “ $ uid”`或该uid不存在。是否grep ":$uid:" /etc/passwd找到了吗?会getent passwd产生任何输出吗?
Mikel 2012年

@cwd:您应该始终有权将ID转换为用户名。例如,ls -l始终这样做。
camh 2012年

只是好奇,因为查看ls共享主机上的列表时,会在用户/组名称列中以ls显示数字。也许是安全预防措施或牢狱之灾?
cwd 2012年

@cwd共享主机更有可能正在使用/etc/passwd当时未安装的/从其他位置安装/ 共享的主机。
jw013

39

您可能会喜欢这个小东西。

$ id -nu [number]

3.17.3-1-ARCH#1 SMP PREEMPT周五11月14日22:56:01 CET 2014 i686 GNU / Linux

我可以确认它在Arch Linux上返回了相应的用户名(如果存在)。我还可以确认以普通用户身份运行时它在Ubuntu上不起作用,尽管我尚未以超级用户身份对其进行测试。它也不适用于Alpine Linux。也许安全功能阻止了此操作在某些系统上运行。


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

2
为我工作,id --version= =id (GNU coreutils) 8.23
eMPee584 '16

在FreeBSD 10.3中也可以使用。
2016年

注意:此功能适用于Red Hat / CentOS> = 7(不适用于Red Hat / CentOS <= 6)
Franklin Piat

FYI这并没有对busybox的/高山LINUX /高山搬运工图像工作
JJJ

0

我意识到这是一个古老的问题,但这是另一个答案

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

grep什么?(此外,如果您在行的开头添加四个空格,则会将其呈现为固定宽度的文本。)
通配符

我更喜欢的答案getent passwd。但是,如果解析/ etc / passwd,那么只使用awk会更好ID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd
富兰克林·皮亚特

-1

解析/ etc / passwd:

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

7
与不同getent,如果系统使用LDAP,则此方法不起作用。
choroba 2012年

3
如果使用NIS或任何其他分布式身份验证协议,这将不起作用。
jlliagre 2012年

@choroba:如果他对LDAP或NIS有特定要求,他可能会提到它。我的解决方案适用于典型的Linux设置。
laebshade 2012年

2
否决投票是因为它不可靠(它可以匹配用户或组)。
富兰克林·皮亚特

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

4
你好,NAIM。尽管这可能是一个正确的答案,但是如果您可以编辑答案以简要说明其工作原理,则将对申请者(以及您的解决方案的未来读者)有所帮助。
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.