Узнайте, существует ли имя пользователя

68

Как я могу узнать в сценарии оболочки, существует ли данное имя пользователя в текущей системе?


/etc/passwdи /etc/shadowявляются неполными. Рассмотрим службы каталогов OS X или Linux с аналогичной интеграцией с Active Directory.

Даниэль Бек
источник

Ответы:

103

Вероятно, одним из самых основных инструментов, которые будут использоваться для этого id.

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

Который производит

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
barbaz
источник
2
Вам не нужны обратные кавычки здесь - просто используйте if id -u "$1" >/dev/null 2>&1; then...
Гордон Дэвиссон
1
@ Гордон абсолютно прав конечно. Спасибо :)
Барбаз
"-u" также кажется ненужным
palacsint
Что если мне нужно только ifс отрицательным результатом проверки?
Юра Шинкарев
id -u $1 1>/dev/null 2>&1; echo $?может быть использован для трубы
JasonWayne
20

getent

Эта команда предназначена для сбора записей для баз данных, которые могут быть поддержаны файлами / etc и различными удаленными службами, такими как LDAP, AD, NIS / Yellow Pages, DNS и тому подобное.

Чтобы выяснить, известно ли имя пользователя одной из служб именования паролей, просто запустите:

getent passwd username

Это работает также с группой, хостами и другими, в зависимости от ОС и реализации.

jlliagre
источник
1
В то время как Solaris и Linux, а в последнее время и большинство BSD getent, есть, getentв Mac OS X их нет
barbaz
Действительно, я скучал по Mac OS / X отсутствует getent.
Jlliagre
Тем не менее, это довольно полезно в системах, которые он поддерживает.
Даниэль Бек
1
getent хорош, потому что вы можете запросить несколько имен пользователей, где id поддерживает только одно имя пользователя.
ноль
6

finger

Разобрать вывод finger -m <username>. Нет кода ошибки, если, к сожалению, пользователь не найден, но если он не найден, вывод ошибки будет записан. Пока никаких недостатков.

finger -ms <username> 2>&1 1>/dev/null | wc -l

Будет напечатано, 0если пользователь найден (потому что не выводится ошибка), в противном случае большие числа.

chown

Запустите (как и любой пользователь, на удивление):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

Если это не так root, как имя учетной записи недействительно.

Если произойдет сбой как не rootпользователя, проанализируйте возможно локализованный вывод для операции « Недопустимый или недопустимый пользователь» (или эквиваленты). Установите LANGзаранее, чтобы сделать это надежно.

Даниэль Бек
источник
0

Я бы сказал, что вы хотели бы полагаться на /etc/passwdподобные программы (например, /etc/shadowдля систем на основе теней; на стороннем замечании некоторые подобные системы могут использовать /etc/master.passwdдругие файлы).

/etc/passwd, Как правило , рассматриваются как абсолютное авторитетное решение о том , существует ли пользователь или нет. Если вы используете какой-либо из других методов, описанных на этой странице, и если эти другие методы указывают на существующего пользователя, но /etc/passwdэто не так, то я бы сказал, что пользователь не существует должным образом в системе, по определению наиболее распространенного стандарта, который программное обеспечение, скорее всего, будет полагаться на.

Тем не менее, я добавлю по-другому, чтобы добавить к смеси некоторых других вариантов, которые могут быть использованы.

ls -l /home | grep ^customUserName$<BR> echo $?

Очевидно, замените «customuserName» на имя пользователя, которого вы хотите проверить. Замените / home на / users, если это то, что использует ваша система. Это может не найти всех пользователей в / etc / passwd, если не создан домашний каталог для конкретного пользователя, что может произойти, если вы просто импортировали пользователей (то есть строки текста в / etc / passwd) и если домашние каталоги этого не делают получить, если / пока человек не войдет в систему.

TOOGAM
источник
Я не понимаю, почему вы указываете пользователя, у которого нет записи в файле / etc / password, но, как сообщается, он действителен idили getentне существует "должным образом" в системе, особенно когда ОП четко указывает, что службы именования быть рассмотренным.
Jlliagre