Parsen Sie shadow
nicht Datei manuell
Das Parsen solcher Dateien ist anfällig, wenn Sie nicht alle Eventualitäten berücksichtigen (z. B. werden deaktivierte Passwörter oft als einzelnes *
codiert; gehen andere Lösungen damit um?).
Außerdem darf die Authentifizierung nicht über shadow
erfolgen (Aber stattdessen über NIS oder LDAP oder wer weiß was). Es gibt Standardwerkzeuge, die all dies für Sie erledigen. In diesem Fall passwd
:
-S, --status Informationen zum Kontostatus anzeigen. Die Statusinformationen bestehen aus 7 Feldern. Das erste Feld ist der Anmeldename des Benutzers. Das zweite Feld gibt an, ob das Benutzerkonto ein gesperrtes Passwort (L), kein Passwort (NP) oder ein verwendbares Passwort (P) hat. Das dritte Feld gibt das Datum der letzten Passwortänderung an. Die nächsten vier Felder sind das Mindestalter, das Höchstalter, der Warnzeitraum und der Inaktivitätszeitraum für das Passwort. Diese Altersangaben werden in Tagen angegeben.
Also passwd -S | cut -d ' ' -f 2
wird ergeben, was Sie brauchen. Ein einfaches Wenn/Dann übersetzt es in Ihre gewünschte Variable:
if [ "$(passwd -S "$USER" | cut -d ' ' -f 2)" = "P" ]
then
disabled="False"
else
disabled="True"
fi
Dasselbe gilt für das Sperren des Passworts eines Benutzers; dies geschieht vorzugsweise über usermod
(--lock
Option), ohne shadow
zu bearbeiten manuell.
Warum nicht einfach alles mit awk erledigen?
awk -F: '/<username>/ {if(substr($2,1,1) == "!"){print "True"} else {print "False"}}' /etc/shadow
U=$user LC_ALL=C awk -F: < /etc/shadow '
$1 "" == ENVIRON["U"] {
user_found = 1
if ($2 ~ /^!/) {
print "True"
exit 0
} else {
print "False"
exit 1
}
}
END {
if (!user_found) {
print "False"
print "User "ENVIRON["U"]" not found" > "/dev/stderr"
exit 2
}
}'
$1 "" == ENVIRON["U"]
vergleicht das erste Feld mit ENVIRON["U"]
lexikalisch. Ohne ""
, könnten die Felder am Ende numerisch verglichen werden, wenn sie wie Zahlen aussehen (wodurch inf
mit INF
abzugleichen oder Infinity
zum Beispiel).
Ohne LC_ALL=C
, seit einigen awk
Implementierungen verwenden strcoll()
für ==
lexikalischen Vergleichs, könnte es am Ende dazu führen, dass falsche Einträge für Benutzernamen geprüft werden, die gleich sortiert sind.