Как я могу найти имя пользователя по идентификатору в Linux?

67

Команду idможно использовать для поиска пользователя uid, например:

$ id -u ubuntu
1000

Есть ли команда для поиска имени пользователя из uid? Я понимаю, что это можно сделать, посмотрев на /etc/passwdфайл, но я спрашиваю, существует ли для этого команда, особенно если пользователь, выполняющий его, не является пользователем root.

Я не ищу имя пользователя текущего пользователя, т.е. я не ищу whoamiили logname.

Это также заставило меня задуматься, если на общем веб-хостинге это функция безопасности, или я просто не понимаю что-то правильно?

Для ознакомления /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. Это редко, но иногда случается.
Барри Браун

Ответы:

35

lsуже выполняет этот поиск. Вы можете выполнить поиск информации о пользователе из командной строки с помощью getent passwd.

Если lsвместо имени пользователя отображается идентификатор пользователя, то это потому, что пользователя с таким именем нет. Файловые системы хранят идентификаторы пользователей, а не имена пользователей. Если вы смонтируете файловую систему из другой системы, или если файл принадлежит удаленному пользователю, или если вы передали числовой идентификатор пользователя chown, у вас может быть файл, который принадлежит идентификатору пользователя, который не имеет имени.

На общем хосте у вас может быть доступ к некоторым файлам, которые совместно используются несколькими виртуальными машинами, каждая из которых имеет свою пользовательскую базу данных. Это немного странно (зачем делиться файлами, а не пользователями, которые их владеют?), Но это технически возможно.

Жиль "ТАК - перестань быть злым"
источник
2
Я вижу номер вместо имени, ls -lесли длина имени превышает восемь символов.
кгрит
@kgrittn Это может зависеть от варианта Unix. GNU ls показывает полное имя пользователя. BusyBox ls усекает его до 8 символов (по крайней мере, в той сборке, которая у меня здесь).
Жиль "ТАК - перестань быть злым"
66

Пытаться

getent passwd "$uid" | cut -d: -f1
jw013
источник
Если это ничего не возвращает, значит ли это, что у меня нет доступа для перевода идентификатора в имя пользователя?
cwd
1
Скорее всего, вы не указали t set "$ uid" или этот идентификатор не существует. Находит grep ":$uid:" /etc/passwdэто? getent passwdПроизводит ли какой-либо вывод?
Микель
@cwd: у вас всегда должен быть доступ для перевода идентификатора в имя пользователя. Например, ls -lвсегда этим занимаюсь.
CAMH
Просто любопытно, потому что при просмотре lsсписка на общедоступном хосте в столбцах имени пользователя / группы отображаются цифры с помощью ls. Возможно, это мера безопасности или джейлшелл?
cwd
@cwd Скорее всего, общий хост использует /etc/passwdподключенный / общий доступ из другого места, который не был подключен в то время.
jw013
39

Возможно, вам понравится эта маленькая песенка.

$ id -nu [number]

3.17.3-1-ARCH # 1 ПРЕДИСЛОВИЕ SMP пт. 14 ноября 22:56:01 CET 2014 i686 GNU / Linux

Я могу подтвердить, что он возвращает соответствующее имя пользователя, если оно существует, в Arch Linux. Я также могу подтвердить, что он не работает в Ubuntu при запуске от имени обычного пользователя, хотя я не проверял это как суперпользователь. Это также не работает на Alpine Linux. Возможно, функция безопасности не позволяет этому работать на некоторых системах.

Стефан
источник
id -u jimmij=> 1000. id -nu 1000=> id: 1000: no such user.
Джимми
2
у меня работает, с id --version=id (GNU coreutils) 8.23
eMPee584
Работает также во FreeBSD 10.3.
Forquare
примечание: это работает на Red Hat / CentOS> = 7 (не на Red Hat / CentOS <= 6)
Франклин Пиат
К вашему сведению, это не работает с изображениями busybox / alpine linux / alpine
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
laebshade
источник
7
В отличие от getentэтого, это не работает, если система использует LDAP.
Чороба
3
это не работает, если используется NIS или любой другой протокол распределенной аутентификации.
Jlliagre
@choroba: если бы у него было определенное требование для LDAP или NIS, он, вероятно, упомянул бы это. Мое решение работает на типичных установках Linux.
laebshade
2
downvote, потому что это не надежно (это может соответствовать или пользователю или группе).
Франклин Пиат
-1
id | awk '{print $1}' | sed 's:.*(::;s:)$::'
NAIM
источник
4
Привет НАИМ. Несмотря на то, что это может быть правильный ответ, он может помочь спрашивающему (и, возможно, будущим читателям вашего решения), если вы сможете отредактировать свой ответ, чтобы кратко объяснить, как это работает.
Ройма