
目的:ユーザーのパスワードがロックされていることを確認してください/etc/shadow
。つまり、/etc/shadowの2番目のフィールド(ユーザーのハッシュパスワードを含む)の最初の文字が感嘆符( '!')であることを確認してください。
希望の出力:$disabled
「True」または「False」を含む名前の変数
ユーザー名は$uname
変数にあり、次のようにしました。
disabled=`cat /etc/shadow |grep $uname |awk -F\: '{print$2}'`
# I now have the password and need one more pipe into the check for the character
# which is where I'm stuck. I would like to do like (in PHP syntax):
| VARIABLE=="!"?"True":"False"`
これは、root権限でCronによって実行され、必要なすべての情報にアクセスできるスクリプトの一部です。
答え1
shadow
ファイルを手動で解析しないでください。
すべての可能なシナリオを考慮しないと、これらのファイルを解析することは困難です(たとえば、無効なパスワードはしばしば単一にエンコードされます。*
他のソリューションはそれを処理できますか?)。
また、認証はshadow
NISまたはLDAPを介して行われない場合があります。これらすべてを処理するいくつかの標準ツールがあります。この場合passwd
:
-S、--状態 アカウントステータス情報を表示します。ステータス情報は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
答え2
すべてのタスクを実行するには、awkを使用するとどうなりますか?
awk -F: '/<username>/ {if(substr($2,1,1) == "!"){print "True"} else {print "False"}}' /etc/shadow
答え3
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()
==
答え4
passwdフィールドが文字列の場合、ユーザーはロックされていますが、セキュリティ上の理由からrootのみを読み取ることができるため、*LK*
確認できません。/etc/shadow
権限が問題にならない場合は、以下を試してください。
while IFS=: read USER PW REST; do
if [ "$USER" = "$uname" ]; then
if [ "$PW" = "*LK*" ]; then
echo "$uname" Locked
fi
fi
done < /etc/shadow
編集:IFS =:移動してコードを簡単にしました。