Дізнайтеся, чи існує ім'я користувача


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

2
Тут вам не потрібні зворотні котирування - просто використовуйте if id -u "$1" >/dev/null 2>&1; then...
Гордон Девіссон,

1
@Gordon абсолютно правильно, звичайно. Дякую :)
barbaz

"-u" також здається непотрібним
palacsint

Що, якщо мені це потрібно лише за ifдопомогою перевірки негативного результату?
Юра Шинкарев

id -u $1 1>/dev/null 2>&1; echo $?можна використовувати для труби
JasonWayne

20

гетен

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

Щоб визначити, чи ім’я користувача відомо однією із служб іменування паролів, просто запустіть:

getent passwd username

Це також працює з групою, хостами та іншими, залежно від ОС та реалізації.


1
У той час як Solaris і Linux, а з недавніх пір і більшість BSD getent, getentна Mac OS X немає
barbaz

Дійсно, я пропустив Mac OS / X не вистачає getent.
jlliagre

Тим не менш, це досить корисно в системах, які він підтримує.
Даніель Бек

1
getent приємно, тому що ви можете запитувати кілька імен користувачів, де id підтримує лише одне ім’я користувача.
nall

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" на ім'я користувача, якого ви хочете перевірити. Замініть / дома на / користувачів, якщо для цього використовується ваша система. Це може не знайти всіх користувачів у / etc / passwd, якщо для конкретного користувача не було створено домашнього каталогу, що може статися, якщо ви просто імпортували користувачів (тобто рядки тексту в / etc / passwd) і якщо домашні каталоги не зробити, якщо / поки людина не ввійде в систему.


Я не розумію, чому ви заявляєте користувача, який не має запису у файлі / etc / password, але, як повідомляється, він є дійсним idабо getentне існує "належним чином" в системі, особливо коли ОП чітко вказує послуги іменування вважати.
jlliagre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.