Sprawdź, czy istnieje nazwa użytkownika

68

Jak mogę dowiedzieć się w skrypcie powłoki, czy dana nazwa użytkownika istnieje w bieżącym systemie?


/etc/passwdi /etc/shadowsą niekompletne. Zastanów się nad usługami katalogowymi OS X lub Linux z podobną integracją z Active Directory.

Daniel Beck
źródło

Odpowiedzi:

103

Prawdopodobnie jednym z najbardziej podstawowych narzędzi do tego celu id.

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

Który produkuje

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
Barbaz
źródło
2
Nie potrzebujesz tutaj cudzysłowów - po prostu użyj if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson
1
@Gordon oczywiście ma absolutną rację. Dzięki :)
barbaz,
„-u” również wydaje się niepotrzebne
palacsint
Co jeśli potrzebowałem tylko ifz funkcją sprawdzania wyników negatywnych?
Yura Shinkarev
id -u $1 1>/dev/null 2>&1; echo $?może być używany do rur
JasonWayne
20

getent

To polecenie służy do gromadzenia wpisów do baz danych, które mogą być wspierane przez pliki / etc i różne zdalne usługi, takie jak LDAP, AD, NIS / Yellow Pages, DNS i podobne.

Aby dowiedzieć się, czy nazwa użytkownika jest znana przez jedną z usług nazewnictwa haseł, po prostu uruchom:

getent passwd username

Działa to również z grupą, hostami i innymi, w zależności od systemu operacyjnego i implementacji.

jlliagre
źródło
1
Podczas gdy Solaris i Linux, a ostatnio także większość BSD getent, nie ma getentw Mac OS X
barbaz
Rzeczywiście brakowało mi Mac OS / X brakuje getent.
jlliagre
Niemniej jednak jest dość przydatny w systemach, które obsługuje.
Daniel Beck
1
getent jest fajny, ponieważ możesz zapytać o wiele nazw użytkowników, gdzie id obsługuje tylko jedną nazwę użytkownika.
nall
6

finger

Analizuj dane wyjściowe z finger -m <username>. Brak kodu błędu, jeśli nie znaleziono użytkownika, niestety, ale jeśli nie zostanie znaleziony, zapisany zostanie wynik błędu. Dotychczas brak wad.

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

Wydrukuje się, 0jeśli użytkownik zostanie znaleziony (ponieważ nie ma wyjścia błędu), w przeciwnym razie większe liczby.

chown

Uruchom (jak każdy użytkownik, co zaskakujące):

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

Jeśli się nie powiedzie root, nazwa konta jest nieprawidłowa.

Jeśli zakończy się niepowodzeniem jako rootużytkownik niebędący użytkownikiem, przeanalizuj ewentualnie zlokalizowane dane wyjściowe dla Operacja niedozwolona lub nieprawidłowy użytkownik (lub odpowiedniki). Ustaw LANGwcześniej, aby zrobić to niezawodnie.

Daniel Beck
źródło
0

Powiedziałbym, że chciałbyś polegać na /etc/passwdpodobnych /etc/shadowsystemach (np. W przypadku systemów opartych na cieniach; na marginesie tematycznym niektóre podobne systemy mogą używać /etc/master.passwdinnych podobnych plików).

/etc/passwdJest zwykle traktowany jako bezwzględną wiarygodnego decyzji o tym, czy użytkownik istnieje, czy nie. Jeśli użyjesz jednej z innych metod opisanych na tej stronie i jeśli te inne metody wskazują na istniejącego użytkownika, ale /etc/passwdgo nie mają, to powiedziałbym, że użytkownik nie istnieje poprawnie w systemie, z definicji najpopularniejszego standardu, który oprogramowanie prawdopodobnie by polegało.

To powiedziawszy, wrzucę w inny sposób, aby dodać do mieszanki innych opcji, które mogą być użyte.

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

Oczywiście zastąp „customuserName” nazwą użytkownika, którego chcesz sprawdzić. Zamień / home na / users, jeśli tego właśnie używa twój system. Może to nie znaleźć wszystkich użytkowników w / etc / passwd, jeśli nie utworzono katalogu domowego dla konkretnego użytkownika, co może się zdarzyć, jeśli po prostu zaimportujesz użytkowników (tj. Wiersze tekstu do / etc / passwd) i jeśli katalogi domowe tego nie zrobią zostać wykonane, chyba że / dopóki osoba się nie zaloguje.

TOOGAM
źródło
Nie rozumiem, dlaczego podajesz użytkownika, który nie ma wpisu w pliku / etc / password, ale jest zgłoszony jako ważny przez system idlub getentnie „poprawnie” istnieje w systemie, szczególnie gdy OP wyraźnie stwierdza, że ​​usługi nazewnictwa są do rozważenia.
jlliagre