Что мне нужно, это что-то вроде:
$ who-has-uid 1000
cyrus
Я знаю, что файл /etc/passwd
содержит такую информацию, я не прошу скрипт, который его анализирует.
Что мне нужно, это что-то вроде:
$ who-has-uid 1000
cyrus
Я знаю, что файл /etc/passwd
содержит такую информацию, я не прошу скрипт, который его анализирует.
Если у вас есть root-доступ, это так просто:
sudo -u \#${pid} whoami
Вы можете попробовать getent (страница руководства getent):
$ getent passwd 1005
shufler:x:1005:119:shufler,,,:/home/local/shufler:/bin/bash
Вы можете разобрать только имя пользователя с помощью sed.
$ who-has-uid() { perl -e 'print +(getpwuid('$1'))[0], "\n"'; }
$ who-has-uid 0
root
$ who-has-uid 1
daemon
Обратите внимание, что это будет работать (при условии, что Perl настроен правильно), даже если информация поступает не из файла /etc/passwd
.
Там нет реальной проверки ошибок; who-has-uid 999
печатает пустую строку, если в системе нет такого UID.
Если вы не настаиваете на однострочнике, вы можете поместить это где-нибудь в вашем $PATH
:
#!/usr/bin/perl
use strict;
use warnings;
my $ok = 1;
foreach my $uid (@ARGV) {
my @pw = getpwuid $uid;
if (@pw) {
print "$pw[0]\n";
}
else {
warn "$uid: No such user\n";
$ok = 0;
}
}
exit 1 if not $ok;
Используйте awk, (обычно устанавливается GNU awk, gawk). Скажите ему использовать двоеточие в качестве разделителя, посмотрите, если поле 3 (UID) равно 1000, затем выведите первое поле (имя пользователя)
gawk -F: '$3 == 1000{print $1}' < /etc/passwd
Это если информация находится в /etc /passwd, если у вас есть данные для входа в сеть (например, в NIS или LDAP), getent работает лучше
getent passwd | gawk -F: '$3 == 1000{print $1}'
Вам нужны одиночные кавычки: если вы используете двойные кавычки, Баш попытается выяснить , что $ 1 означает , что в оболочке, а не передать его поглазеть.