GNU/Linux >> Belajar Linux >  >> Linux

BASH:Periksa /etc/shadow jika kata sandi pengguna dikunci

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.


Linux
  1. Bash =~ Regex Dan Https://regex101.com/?

  2. Linux – Ekstrak Tanggal Dari /etc/shadow?

  3. Bagaimana /etc/motd Diperbarui?

  1. Bagaimana memulihkan dari entri root yang dihapus di file /etc/shadow dan/atau /etc/passwd di CentOS / RHEL 6

  2. Cara menghapus entri yang tidak diinginkan di file /etc/shadow

  3. Cara Menghapus Entri yang tidak perlu di /etc/shadow

  1. Memahami file /etc/login.defs

  2. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?

  3. Perbedaan antara ! vs!! vs * di /etc/shadow