Ich möchte ein Skript erstellen, um zu überprüfen, ob ein Benutzer vorhanden ist. Ich verwende die folgende Logik:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Wenn der Benutzer existiert, haben wir Erfolg, sonst existiert der Benutzer nicht. Ich habe den obigen Befehl wie folgt in das Bash-Skript eingefügt:
#!/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
Jetzt sagt mein Skript immer, dass der Benutzer existiert, egal was passiert:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Warum wird die obige Bedingung immer als WAHR bewertet und es wird angegeben, dass der Benutzer vorhanden ist?
Wo gehe ich falsch?
AKTUALISIEREN:
Nachdem ich alle Antworten gelesen hatte, fand ich das Problem in meinem Skript. Das Problem war die Art und Weise, wie ich die getent
Ausgabe umleitete . Also habe ich alles Umleitungsmaterial entfernt und die getent
Zeile so aussehen lassen:
getent passwd $user > /dev/null
Jetzt funktioniert mein Skript einwandfrei.
$?
Sie den Rückkehrcode destest
Befehls. Siehe Antwort unten.getent
und Ihrerif
Anweisung? Dies würde dazu führen$?
, dass der Exit-Status vonecho
und nicht Ihr Anruf bei überprüft wirdgetent
.2>&1
statt2&>1
.$1
nicht festgelegt, gibt die if-Anweisung true zurück. Nach meinen Tests wäre die Lösung,$1
in doppelte Anführungszeichen zu setzen :getent passwd "$1" > /dev/null 2&>1
.Antworten:
Sie können den Benutzer auch per
id
Befehl überprüfen .id -u name
gibt Ihnen die ID dieses Benutzers. Wenn der Benutzer nicht existiert, erhalten Sie den Befehl return value ($?
)1
quelle
validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }
. Das gibt so ziemlich 1 zurück, wenn ein Benutzer vorhanden ist, oder 0, wenn dies nicht der Fall ist.Warum benutzt du nicht einfach
Es wird 1 zurückgegeben (da ein Benutzer maximal 1 Eintrag hat), wenn der Benutzer existiert, und 0, wenn dies nicht der Fall ist.
quelle
getent passwd | grep -c '^username:'
:
nach dem Benutzernamen schützt vor Übereinstimmungen mit Teilzeichenfolgen, indem er mit dem Feldtrennzeichen übereinstimmt, sodass der von Ihnen beschriebene Effekt nicht auftritt.Der Exit-Code muss nicht explizit überprüft werden. Versuchen
Wenn das nicht funktioniert, stimmt etwas nicht mit Ihrem
getent
oder Sie haben mehr Benutzer definiert als Sie denken.quelle
Folgendes habe ich in einem
Freeswitch
Bash-Startskript getan :quelle
Ich schlage vor, den Befehl id zu verwenden, da er die gültige Benutzerexistenz für den Eintrag in einer passwd-Datei testet, was nicht erforderlich ist. Dies bedeutet dasselbe:
Hinweis: 0 ist Root-UID.
quelle
Ich habe es so benutzt:
quelle
Mit Abstand die einfachste Lösung:
Das
>/dev/null 2>&1
kann&>/dev/null
in Bash gekürzt werden .quelle
Skript zum Überprüfen, ob ein Linux-Benutzer vorhanden ist oder nicht
Skript Zum Überprüfen, ob der Benutzer vorhanden ist oder nicht
quelle
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Späte Antwort,
finger
zeigt aber auch weitere Informationen zum Benutzerquelle
Eigentlich kann ich das Problem nicht reproduzieren. Das in der Frage geschriebene Skript funktioniert einwandfrei, außer in dem Fall, in dem $ 1 leer ist.
Es gibt jedoch ein Problem im Skript im Zusammenhang mit der Umleitung von
stderr
. Obwohl die beiden Formen&>
und>&
existieren, möchten Sie in Ihrem Fall verwenden>&
. Sie haben bereits umgeleitetstdout
, deshalb&>
funktioniert das Formular nicht. Sie können dies auf folgende Weise leicht überprüfen:Sie sehen eine Datei mit dem Namen
1
im aktuellen Verzeichnis. Sie möchten2>&1
stattdessen Folgendes verwenden oder Folgendes verwenden:Dies leitet auch um
stdout
undstderr
zu/dev/null
.Warnung Eine Umleitung
stderr
zu ist/dev/null
möglicherweise keine so gute Idee. Wenn etwas schief geht, haben Sie keine Ahnung warum.quelle
Benutzerinformationen werden in / etc / passwd gespeichert, sodass Sie mit "grep 'usename' / etc / passwd" überprüfen können, ob der Benutzername vorhanden ist. In der Zwischenzeit können Sie den Shell-Befehl "id" verwenden. Er druckt die Benutzer-ID und die Gruppen-ID. Wenn der Benutzer nicht vorhanden ist, wird die Meldung "Kein solcher Benutzer" ausgegeben.
quelle
Melden Sie sich beim Server an. grep "Benutzername" / etc / passwd Dies zeigt die Benutzerdetails an, falls vorhanden.
quelle
if grep -q "^username:" /etc/passwd; then ...
Mit sed:
quelle
Abhängig von Ihrer Shell-Implementierung (z. B. Busybox vs. Erwachsener) kann der
[
Bediener einen Prozess starten und sich ändern$?
.Versuchen
quelle
$?
gibt mir die gleiche Ausgabe. Dies ist die Bash-Version:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
if test "$RES" == "0"; then ...
$?
würde vor dem Ausführen erweitert werden[
, das ist also kein Problem.if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
Unten finden Sie das Skript zum Überprüfen der Betriebssystemverteilung und zum Erstellen eines Benutzers, falls nicht vorhanden, und zum Nichtstun, wenn ein Benutzer vorhanden ist.
quelle
Erstellen Sie einen Systembenutzer,
some_user
falls dieser nicht vorhanden istquelle
Ich mag diese schöne einzeilige Lösung
und im Skript:
verwenden:
quelle