BASH:/etc/shadowユーザーパスワードがロックされていることを確認してください。

BASH:/etc/shadowユーザーパスワードがロックされていることを確認してください。

目的:ユーザーのパスワードがロックされていることを確認してください/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ファイルを手動で解析しないでください。

すべての可能なシナリオを考慮しないと、これらのファイルを解析することは困難です(たとえば、無効なパスワードはしばしば単一にエンコードされます。*他のソリューションはそれを処理できますか?)。

また、認証はshadowNISまたは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(オプション)で行うのが最善です。--lockshadow

答え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"]比較します。そうでない場合、フィールドが数値のように見える場合(たとえば、一致または一致が発生した場合)、数値比較を実行できます""infINFInfinity

そうでない場合、一部の実装 は語彙比較を使用するため、同じ順序で並べられたユーザー名に対して誤った項目を調べることがありますLC_ALL=Cawkstrcoll()==

答え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 =:移動してコードを簡単にしました。

関連情報