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ě.