GNU/Linux >> Linux の 問題 >  >> Linux

BASH:ユーザーのパスワードがロックされている場合は、/etc/shadow をチェックインします

shadow を解析しない 手動でファイル

すべての不測の事態を考慮しないと、そのようなファイルの解析は脆弱になります (たとえば、無効化されたパスワードは、多くの場合、単一の * としてエンコードされます。;他の解決策はそれを処理しますか?)

さらに、認証が shadow 経由で行われない場合があります (代わりに、NIS や ldap などを使用します)。これらすべてを処理する標準ツールがあります。この場合、passwd :

<ブロック引用>

-S, --status アカウントのステータス情報を表示します。ステータス情報は 7 つのフィールドで構成されます。最初のフィールドはユーザーのログイン名です。 2 番目のフィールドは、ユーザー アカウントにロックされたパスワードがあるか (L)、パスワードがないか (NP)、または使用可能なパスワードがあるか (P) を示します。 3 番目のフィールドには、パスワードが最後に変更された日付が表示されます。次の 4 つのフィールドは、パスワードの最小有効期間、最大有効期間、警告期間、および非アクティブ期間です。これらの年齢は日数で表されます。

だから passwd -S | cut -d ' ' -f 2 必要なものが得られます。単純な if/then は、それを目的の変数に変換します:

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

同じことがユーザーのパスワードのロックにも当てはまります。これは usermod で行うのが望ましい (--lock オプション)、shadow を編集しない


すべて 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"] 最初のフィールドを ENVIRON["U"] と比較します 字句的に。 "" なし 、フィールドが数字のように見える場合、フィールドが数値的に比較される可能性があります(inf INF と照合します または Infinity たとえば)

LC_ALL=C なし 、いくつかの awk 以来 実装は strcoll() を使用します == の場合 字句比較では、同じように並べ替えるユーザー名の間違ったエントリをチェックしてしまう可能性があります。


Linux
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Bash =〜正規表現とHttps://regex101.com/?

  3. /etc/login.defs ファイルについて

  1. /etc/shadow の不要なエントリを削除する方法

  2. /etc/passwd はグループ内のユーザーを表示しますが、/etc/group は表示しません

  3. /etc/shadow から日付を抽出する

  1. Mac の /etc/shadow

  2. /etc/shadow のパスワードを手動で生成する

  3. との差 !対!! vs * /etc/shadow 内