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()
を使用します ==
の場合 字句比較では、同じように並べ替えるユーザー名の間違ったエントリをチェックしてしまう可能性があります。