Як я можу шукати ім'я користувача за ідентифікатором в 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

@kgrittn Це може залежати від варіанту Unix. GNU ls показує все ім’я користувача. BusyBox ls обрізає його до 8 символів (принаймні, про збірку, яку я маю тут).
Жиль

66

Спробуйте

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

Якщо це не повертає нічого, це не означає, що я не маю доступу для перекладу ідентифікатора на ім’я користувача?
cwd

1
Швидше за все, ви не зробили t set "$ uid" `або цей 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 SME PREEMPT Пт 14 листопада 22:56:01 CET CET i686 GNU / Linux

Я можу підтвердити, що він повертає відповідне ім'я користувача, якщо таке існує, в Arch Linux. Я також можу підтвердити, що він не працює на Ubuntu, коли він працює як звичайний користувач, хоча я не перевіряв це як суперпользователь. Він також не працює на Alpine Linux. Можливо, функція безпеки заважає цьому працювати в деяких системах.


id -u jimmij=> 1000. 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, це не працює на
зайнятих

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.
Франклін Піат

-1

Розбір / etc / passwd:

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

7
На відміну від getentцього, це не працює, якщо система використовує LDAP.
choroba

3
це не працює, якщо використовується NIS або будь-який інший розподілений протокол аутентифікації.
jlliagre

@choroba: якби у нього була конкретна вимога щодо LDAP або NIS, він, мабуть, зазначив би це. Моє рішення працює в типових налаштуваннях Linux.
в'язниця

2
downvote, оскільки це не надійно (може відповідати або користувачеві, або групі).
Франклін Піат

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

4
Привіт NAIM. Хоча це може бути правильною відповіддю, це допоможе запитувачу (і цілком можливо майбутнім читачам вашого рішення), якщо ви зможете відредагувати свою відповідь, щоб коротко пояснити, як це працює.
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.