Wenn Anweisung Benutzer-ID in etc / passwd abfragen?

8

Mit bash versuche ich, /etc/passwdBenutzer mit einer ID über 1000 abzufragen . Wenn sie vorhanden sind, tun Sie etwas, sonst tun Sie etwas anderes. Ich bin ratlos. Jede Hilfe wird geschätzt.

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi
user3239222
quelle
1
Muss dies in Bash (Shell) sein?
Stephen Rauch
Ja Entschuldigung. using bash
user3239222

Antworten:

8

Versuche dies:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'

Der erste grepsucht passwdnach Zeilen mit einer vier- oder mehrstelligen UID. Der zweite grepFilter filtert die Zeile mit uid 1000 heraus. Der Exit-Status ist 0, wenn noch Zeilen vorhanden sind, 1, wenn nicht.

Tom Zych
quelle
Ich erhalte einen Syntaxfehler: Unerwartetes Dateiende
user3239222
Sie müssen ihm mit einer thenLinie usw. folgen
Tom Zych
1
Ich habe vergessen; Machen Sie den zweiten Grep -Evq, um seine Ausgabe zu unterdrücken.
Tom Zych
4
So wie es aussieht, sucht es nach UID-Feldern, die mindestens 4 Zeichen lang sind, was hier funktioniert, aber nicht sehr nützlich ist, wenn der Grenzwert etwas anderes als eine Zehnerpotenz ist. Auch die Ergebnisse können verwirrend sein, wenn einige der Zahlen aus irgendeinem Grund führende Nullen erhalten.
Ilkkachu
1
Wenn Sie YP / NIS oder LDAP verwenden, analysieren Sie die Ausgabe von getent passwdanstelle der /etc/passwdDatei.
Kusalananda
16

Um dies in einer bashSchleife zu tun, schlage ich vor, Folgendes zu verwenden readund zu IFSmögen:

#!/usr/bin/env bash
while IFS=':' read -r user passwd uid gid comment home shell;  do
    if [ "$uid" -gt 1000 ] ; then
        echo GT $user
    else
        echo LT $user
    fi
done < /etc/passwd
Stephen Rauch
quelle
versuchte das, aber es gibt alle Benutzer LT und GT aus
user3239222
1
Es gibt einige Benutzer als LT, und den Rest als GT. Welches ist, was ich dachte, dass Sie brauchen.
Stephen Rauch
Ich möchte nur überprüfen, etc / Passwort, um zu sehen, ob UIDs größer als 1000 existieren und etwas tun, wenn wahr, etwas anderes tun, wenn falsch ..
user3239222
4
Die Schlüsselwörter in Ihrem Kommentar sind, falls vorhanden , die Frage, für die und sie gesagt wurden . Der Plural, den sie mir anzeigten, dass Sie beabsichtigten, jeden Benutzer zu verarbeiten. Aber drei andere Antworten hier haben es nicht so gelesen, also ...
Stephen Rauch
14

Anstatt /etc/passwddirekt zu lesen , sollten Sie dies verwenden getent passwd. Dies funktioniert auch, wenn einige Ihrer Benutzer in LDAP oder Ähnlichem gespeichert sind. awksollte für das durch Doppelpunkte getrennte Ausgabeformat gut geeignet sein.

Dies würde die Benutzernamen aller Benutzer mit UID> 1000 drucken:

getent passwd | awk -F: '$3 > 1000 {print $1}'

Und dies würde nur gedruckt, foundwenn mindestens eines davon gefunden wird:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'
ilkkachu
quelle
Wie würde ich dies mit einer if-Anweisung verwenden? Wenn $ 3> 1000, tun Sie etwas
user3239222
Ich habe dies ein wenig geändert, da der erste Desktop-Benutzer gleich 1000 ist und es andere Benutzertypen wie "niemand" gibt. getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
Daher
@benjaoming, ähm, ja, >= 1000scheint in der Tat sinnvoll zu sein. Die Frage hatte jedoch > 1000aus irgendeinem Grund. nobodyscheint häufig zu sein 6553xoder 3276x, daher können Sie diese Obergrenze wahrscheinlich etwas anheben.
Ilkkachu
4

Dieses Konstrukt macht wenig Sinn:

"$(id -u)" -gt "1000" </etc/passwd

Der idBefehl funktioniert unabhängig von der Eingabeumleitung. Die Umleitung macht hier sowieso keinen Sinn.

Sie können diese Pipeline in Ihrem Testvergleich verwenden. Es zeigt Ihnen die höchste Benutzer-ID auf dem Computer:

cat /etc/passwd | awk -F: '{print $3}' | sort -n | tail -n1

Möglicherweise möchten Sie es für einige Systeme optimieren, da möglicherweise der nobodyBenutzer mit der UID 65534vorhanden ist.


quelle
1

Mit Toms Code hat das bei mir funktioniert.

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi
user3239222
quelle
Ich habe einen Benutzer erstellt mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. Wenn ich den Code ausführe, von dem es heißt, dass er existiert, wenn ich den Benutzer lösche, heißt es, dass er nicht existiert. L)
user3239222