GNU/Linux >> LINUX-Kenntnisse >  >> Linux

BASH:Überprüfen Sie in /etc/shadow, ob das Benutzerkennwort gesperrt ist

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.


Linux
  1. Warum hat ein MySQL-Benutzer eine Bash-Shell in /etc/passwd?

  2. Bash =~ Regex und Https://regex101.com/?

  3. Linux – Daten aus /etc/shadow extrahieren?

  4. So stellen Sie gelöschte Root-Einträge in /etc/shadow- und/oder /etc/passwd-Dateien in CentOS / RHEL 6 wieder her

  5. So entfernen Sie unerwünschte Einträge in der Datei /etc/shadow

Verstehen der /etc/passwd-Datei

Verstehen der /etc/shadow-Datei

Was ist die Datei /etc/passwd unter Linux?

Daten aus /etc/shadow extrahieren

/etc/shadow auf dem Mac

Passwort für /etc/shadow manuell generieren