Jangan mengurai shadow
file secara manual
Mengurai file seperti itu rapuh jika Anda gagal memperhitungkan semua kemungkinan (misalnya, kata sandi yang dinonaktifkan sering kali dikodekan sebagai *
tunggal; apakah solusi lain mengatasinya?).
Selain itu, autentikasi mungkin tidak terjadi melalui shadow
(melainkan melalui NIS atau ldap atau entah apa). Ada alat standar yang akan menangani semua ini untuk Anda. Dalam hal ini, passwd
:
-S, --status Menampilkan informasi status akun. Informasi status terdiri dari 7 bidang. Kolom pertama adalah nama login pengguna. Bidang kedua menunjukkan jika akun pengguna memiliki kata sandi terkunci (L), tidak memiliki kata sandi (NP), atau memiliki kata sandi yang dapat digunakan (P). Bidang ketiga memberikan tanggal perubahan kata sandi terakhir. Empat bidang berikutnya adalah usia minimum, usia maksimum, periode peringatan, dan periode tidak aktif untuk kata sandi. Usia ini dinyatakan dalam hari.
Jadi passwd -S | cut -d ' ' -f 2
akan menghasilkan apa yang Anda butuhkan. Jika/maka yang sederhana akan menerjemahkannya ke variabel yang Anda inginkan:
if [ "$(passwd -S "$USER" | cut -d ' ' -f 2)" = "P" ]
then
disabled="False"
else
disabled="True"
fi
Hal yang sama berlaku untuk mengunci kata sandi pengguna; ini sebaiknya dilakukan melalui usermod
(--lock
opsi), bukan mengedit shadow
secara manual.
Mengapa tidak melakukan semuanya dengan 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"]
membandingkan kolom pertama dengan ENVIRON["U"]
secara leksikal. Tanpa ""
, bidang dapat dibandingkan secara numerik jika terlihat seperti angka (menyebabkan inf
untuk dicocokkan dengan INF
atau Infinity
misalnya).
Tanpa LC_ALL=C
, karena beberapa awk
implementasi menggunakan strcoll()
untuk ==
perbandingan leksikal, itu bisa berakhir dengan memeriksa entri yang salah untuk nama pengguna yang mengurutkan sama.