Chcę utworzyć skrypt, aby sprawdzić, czy użytkownik istnieje. Używam poniższej logiki:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Więc jeśli użytkownik istnieje, to mamy sukces, w przeciwnym razie użytkownik nie istnieje. Powyższe polecenie umieściłem w skrypcie bash, jak poniżej:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Teraz mój skrypt zawsze mówi, że użytkownik istnieje bez względu na wszystko:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Dlaczego powyższy warunek zawsze jest PRAWDZIWY i mówi, że użytkownik istnieje?
Gdzie się mylę?
AKTUALIZACJA:
Po przeczytaniu wszystkich odpowiedzi znalazłem problem w swoim skrypcie. Problem polegał na sposobie przekierowywania getent
danych wyjściowych. Usunąłem więc wszystkie przekierowania i sprawiłem, że getent
linia wygląda tak:
getent passwd $user > /dev/null
Teraz mój skrypt działa dobrze.
$?
, otrzymasz kod zwrotnytest
polecenia. Zobacz odpowiedź poniżej.getent
aif
instrukcją? To spowodowałoby$?
sprawdzenie statusu wyjściaecho
, a nie twojego wywołaniagetent
.2>&1
zamiast2&>1
.$1
nie jest ustawiony, instrukcja if zwróci wartość true. Z moich badań, rozwiązaniem byłoby zawinąć$1
w cudzysłowach:getent passwd "$1" > /dev/null 2&>1
.Odpowiedzi:
możesz również sprawdzić użytkownika za pomocą
id
polecenia.id -u name
podaje identyfikator tego użytkownika. jeśli użytkownik nie istnieje, otrzymałeś polecenie zwracające wartość ($?
)1
źródło
validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }
. To prawie zwraca 1, jeśli użytkownik istnieje, lub 0, jeśli nie.Dlaczego po prostu nie użyjesz
Zwróci 1 (ponieważ użytkownik ma maksymalnie 1 wpis), jeśli użytkownik istnieje, i 0, jeśli nie.
źródło
getent passwd | grep -c '^username:'
:
po nazwie użytkownika chroni przed dopasowywaniem podciągów przez dopasowanie do separatora pól, więc opisywany efekt nie wystąpi.Nie ma potrzeby jawnego sprawdzania kodu zakończenia. Próbować
Jeśli to nie zadziała, coś jest nie tak z Twoim
getent
lub masz zdefiniowanych więcej użytkowników, niż myślisz.źródło
Oto, co zrobiłem w
Freeswitch
skrypcie startowym bash:źródło
Proponuję użyć polecenia id, ponieważ testuje on prawidłowe istnienie użytkownika z wpisem w pliku passwd, który nie jest konieczny, oznacza to samo:
Uwaga: 0 to identyfikator użytkownika root.
źródło
Używałem tego w ten sposób:
źródło
Zdecydowanie najprostsze rozwiązanie:
>/dev/null 2>&1
Można skrócić do&>/dev/null
bash.źródło
Skrypt sprawdzający, czy użytkownik Linuksa istnieje, czy nie
Skrypt Aby sprawdzić, czy użytkownik istnieje, czy nie
źródło
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Późna odpowiedź, ale
finger
pokazuje również więcej informacji o użytkownikuźródło
Właściwie nie mogę odtworzyć problemu. Skrypt napisany w pytaniu działa dobrze, z wyjątkiem przypadku, gdy $ 1 jest pusty.
Jednak w skrypcie występuje problem związany z przekierowaniem
stderr
. Chociaż dwie formy&>
i>&
istnieją, w Twoim przypadku chcesz użyć>&
. Już przekierowałeśstdout
, dlatego formularz&>
nie działa. Możesz to łatwo zweryfikować w ten sposób:Zobaczysz plik o nazwie
1
w bieżącym katalogu. Zamiast tego chcesz użyć2>&1
lub użyj tego:To również przekierowuje
stdout
istderr
do/dev/null
.Ostrzeżenie Przekierowanie
stderr
do/dev/null
może nie być dobrym pomysłem. Kiedy coś pójdzie nie tak, nie będziesz miał pojęcia, dlaczego.źródło
informacje o użytkowniku są przechowywane w / etc / passwd, więc możesz użyć „grep 'nazwa_użytkownika' / etc / passwd”, aby sprawdzić, czy nazwa użytkownika istnieje. w międzyczasie możesz użyć polecenia powłoki „id”, wypisze ono identyfikator użytkownika i identyfikator grupy, a jeśli użytkownik nie istnieje, wyświetli komunikat „nie ma takiego użytkownika”.
źródło
Zaloguj się do serwera. grep "nazwa użytkownika" / etc / passwd Spowoduje to wyświetlenie szczegółów użytkownika, jeśli są obecne.
źródło
if grep -q "^username:" /etc/passwd; then ...
Korzystanie z seda:
źródło
W zależności od implementacji powłoki (np. Busybox czy dorosły)
[
operator może rozpocząć proces, zmieniając się$?
.Próbować
źródło
$?
daje mi ten sam wynik. To jest wersja basha:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
if test "$RES" == "0"; then ...
$?
zostanie rozwinięty przed[
uruchomieniem, więc nie stanowi to problemu.if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
Poniżej znajduje się skrypt, który sprawdza dystrybucję systemu operacyjnego i tworzy użytkownika, jeśli nie istnieje, i nie robi nic, jeśli użytkownik istnieje.
źródło
Utwórz użytkownika systemowego,
some_user
jeśli nie istniejeźródło
Podoba mi się to ładne, jednokreskowe rozwiązanie
i w scenariuszu:
posługiwać się:
źródło