Prüfen Sie, Ob ein Benutzer Existiert
Ich möchte ein Skript erstellen, um zu überprüfen, ob ein Benutzer existiert. Ich bin mit der logic unten:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
So, wenn der Benutzer vorhanden ist, dann werden wir Erfolg haben, sonst ist der Benutzer nicht vorhanden ist. Ich habe oben den Befehl in der bash-Skript wie folgt:
#!/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
Nun, mein Skript sagt immer, dass der Benutzer vorhanden ist, egal was:
# 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 oben genannte Bedingung immer auswerten, um WAHR zu sein und zu sagen, dass der user existiert?
Wohin gehe ich falsch?
UPDATE:
Nach der Lektüre alle Antworten, ich fand das problem in meinem Skript. Das problem war die Art, wie ich war, die Umleitung getent
Ausgabe. Also habe ich alle entfernt die Umleitung Zeug und machte die getent
Zeile wie folgt Aussehen:
getent passwd $user > /dev/null
Nun mein script funktioniert Prima.
$?
erhalten Sie den return-code des test
Befehl. Siehe Antwort unten.Ist, dass der genaue code ausgeführt werden? Keine "echo" debug-Anweisungen zwischen dem Aufruf
getent
und Ihre if
Aussage? Dazu führen würde, dass $?
zu prüfen, den exit-status von echo
, nicht Ihren Anruf zu getent
.Ja, ich denke du meinst
2>&1
statt 2&>1
.Code funktioniert auch auf nicht-leere Eingabe, aber wenn
$1
ist nicht festgelegt, wird die if-Anweisung gibt true zurück. Von meinen Tests, Lösung wäre wrap $1
im Doppelzimmer Zitate: getent passwd "$1" > /dev/null 2&>1
.Bitte markieren Sie eine Antwort
InformationsquelleAutor slayedbylucifer | 2013-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie auch überprüfen, Benutzer von
id
Befehl.id -u name
gibt dir die id des Benutzers.wenn der Benutzer nicht vorhanden ist, haben Sie Befehl return Wert (
$?
)1
tolle Antwort - nur ein kleines zwicken, das funktioniert gut... user_exists=$(id -u user > /dev/null 2>&1; echo $?) user_exists=0, wenn "user" vorhanden ist, oder 1, wenn nicht
Das funktionierte perfekt!
Ich denke, deine variable sollte den Namen user_doesnt_exist
Auf einer Allgemeinen Ebene boolean Handhabung in der bash ist meiner Meinung nach weniger als klar, und ich in der Regel zu vermeiden implizite Boolesche Rückschlüsse in meinem code. Die folgenden stellen eine interessante Lektüre und interessanterweise beide befürworten 0 = true und <0> = false bash Zwecke, und zwar nicht de facto, richten die variable name, den ich verwendet haben, von einem booleschen Perspektive auch: stackoverflow.com/a/5431932/3051627 . stackoverflow.com/questions/2933843/... .
InformationsquelleAutor Kent
Warum nicht nutzen Sie einfach
Es gibt 1 zurück (da ein Benutzer hat max. 1 Eintrag) wenn der Benutzer vorhanden ist und 0, wenn nicht.
getent passwd | grep -c '^username:'
diese gibt 1 zurück, wenn Sie haben einen Benutzernamen, sagen wir mal "test1" und möchten, erstellen Sie einen neuen Benutzernamen namens "test".
der Doppelpunkt
:
nach dem Benutzernamen schützt gegen substring matching nach matching mit der Feld-separator, also der Effekt, den Sie beschreiben, wird nicht passieren.InformationsquelleAutor poitroae
Es gibt keine Notwendigkeit, überprüfen Sie die exit-code explizit. Versuchen
Wenn das nicht funktioniert, es ist etwas falsch mit Ihrem
getent
oder mehr Benutzer definiert sind, als Sie denken.InformationsquelleAutor chepner
Dies ist, was ich am Ende tun, in einer
Freeswitch
bash-Skript startup:InformationsquelleAutor Daniel Sokolowski
Schlage ich-id-Befehl, wie es tests gültig Benutzer Existenz wrt passwd-Datei-Eintrag, das ist nicht notwendig dasselbe bedeutet:
Hinweis: 0 ist root, uid.
InformationsquelleAutor Valdas Rapševičius
War ich mit es so:
InformationsquelleAutor Takeda
Skript, um zu Überprüfen, ob die Linux-Benutzer vorhanden ist oder nicht
Skript überprüfen, ob der Benutzer existiert oder nicht
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Ja Alexx Roche,es gibt keine Katze,die ich habe, um den besseren Weg, um zu visualisieren das Konzept für Anfänger.
InformationsquelleAutor Bakul Gupta
Eigentlich ich kann das problem reproduzieren. Das script wie geschrieben, die Frage funktioniert gut, außer für den Fall, wenn $1 leer ist.
Allerdings gibt es ein problem im script bezüglich der Umleitung von
stderr
. Obwohl die beiden Formen&>
und>&
vorhanden ist, in Ihrem Fall, den Sie verwenden möchten>&
. Sie bereits umgeleitetstdout
, das ist, warum die form&>
funktioniert nicht. Sie können ganz einfach überprüfen Sie es auf diese Weise:Sehen Sie eine Datei namens
1
im aktuellen Verzeichnis. Sie verwenden möchten2>&1
statt, oder benutzen Sie dies:Dieser leitet auch
stdout
undstderr
zu/dev/null
.Warnung Umleiten
stderr
zu/dev/null
vielleicht nicht so eine gute Idee. Wenn die Dinge schief gehen, Sie haben keine Ahnung, warum.InformationsquelleAutor Christian Hujer
Benutzer-Informationen, gespeichert in /etc/passwd, so kann man mit "grep 'usename' /etc/passwd", um zu überprüfen, ob der Benutzername existiert.
in der Zwischenzeit können Sie nutzen, "id" shell-Kommando, wird es drucken Sie die Benutzer-id und Gruppen-id, wenn der Benutzer nicht vorhanden ist, wird print "kein solcher Benutzer" angezeigt.
InformationsquelleAutor Yu Chai
Login auf den server.
grep "username" /etc/passwd
Dies zeigt den Benutzer-details, falls vorhanden.
if grep -q "^username:" /etc/passwd; then ...
InformationsquelleAutor syam
Späte Antwort, aber
finger
zeigt auch weitere Informationen über BenutzerInformationsquelleAutor jackotonye
Je nach shell-Implementierung (z.B. Busybox vs. Erwachsene) die
[
Betreiber könnte einen Prozess starten, ändern$?
.Versuchen
$?
gibt mir die gleiche Ausgabe. Dies ist die bash-version:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
Versuchen
if test "$RES" == "0"; then ...
$?
würde erweitert werden, bevor[
läuft, so ist das kein problem.Anstelle von Tests auf das Ergebnis des Befehls, können Sie den Befehl testen direkt:
if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
InformationsquelleAutor Eugen Rieck