GNU/Linux >> Znalost Linux >  >> Linux

BASH:Zkontrolujte v /etc/shadow, pokud je heslo uživatele uzamčeno

Neanalyzujte shadow soubor ručně

Analýza takových souborů je křehká, pokud nezohledníte všechny možnosti (například zakázaná hesla jsou často zakódována jako jediné *; řeší to jiná řešení?).

Navíc k ověření nemusí dojít prostřednictvím shadow (ale místo toho přes NIS nebo ldap nebo kdo ví co). Existují standardní nástroje, které se s tím vším vypořádají za vás. V tomto případě passwd :

-S, --status Zobrazení informací o stavu účtu. Stavové informace se skládají ze 7 polí. První pole je přihlašovací jméno uživatele. Druhé pole udává, zda má uživatelský účet zamčené heslo (L), nemá žádné heslo (NP) nebo má použitelné heslo (P). Třetí pole uvádí datum poslední změny hesla. Další čtyři pole jsou minimální věk, maximální věk, doba varování a doba nečinnosti hesla. Tento věk je vyjádřen ve dnech.

Takže passwd -S | cut -d ' ' -f 2 přinese to, co potřebujete. Jednoduché if/then to převede na požadovanou proměnnou:

if [ "$(passwd -S "$USER" | cut -d ' ' -f 2)" = "P" ]
then
    disabled="False"
else
    disabled="True"
fi

Totéž platí pro uzamčení hesla uživatele; to se nejlépe provádí pomocí usermod (--lock možnost), bez úpravy shadow ručně.


Proč to všechno prostě neudělat pomocí awk?

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"] porovná první pole s ENVIRON["U"] lexikálně. Bez "" , pole by mohla být porovnána číselně, pokud by vypadala jako čísla (což by způsobilo inf k porovnání s INF nebo Infinity například).

Bez LC_ALL=C , protože některé awk implementace používají strcoll() pro == lexikálním srovnáním, mohlo by to skončit kontrolou chybných záznamů pro uživatelská jména, která se řadí stejně.


Linux
  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

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

  3. Linux – extrahovat data z /etc/shadow?

  1. Jak se aktualizuje /etc/motd?

  2. Jak odstranit nežádoucí položky v souboru /etc/shadow

  3. Vysvětlení souboru /etc/login.defs

  1. Proč má uživatel mysql bash shell v /etc/passwd?

  2. Extrahujte data z /etc/shadow

  3. /etc/shadow na Macu