2

Что мне нужно, это что-то вроде:

$ who-has-uid 1000
cyrus

Я знаю, что файл /etc/passwd содержит такую информацию, я не прошу скрипт, который его анализирует.

4 ответа4

4

Если у вас есть root-доступ, это так просто:

sudo -u \#${pid} whoami
2

Вы можете попробовать getent (страница руководства getent):

$ getent passwd 1005
shufler:x:1005:119:shufler,,,:/home/local/shufler:/bin/bash

Вы можете разобрать только имя пользователя с помощью sed.

1
$ 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;
0

Используйте 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 означает , что в оболочке, а не передать его поглазеть.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .