Linux

BASH:如果使用者密碼被鎖定,請檢查 /etc/shadow

  • November 2, 2018

**目的:**檢查/etc/shadow使用者密碼是否被鎖定,即 /etc/shadow 中包含使用者雜湊密碼的第二個欄位中的第一個字元是否為驚嘆號(’!’)

**期望的輸出:**一個名為$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 執行,因此可以訪問所有需要的資訊。

為什麼不只用 awk 來完成這一切呢?

awk -F: '/<username>/ {if(substr($2,1,1) == "!"){print "True"} else {print "False"}}' /etc/shadow

不要shadow手動解析文件

如果您未能考慮所有可能性(例如,禁用的密碼通常被編碼為單個*; 其他解決方案是否可以處理這種情況?),那麼解析此類文件是脆弱的。

此外,身份驗證可能不會通過shadow(而是通過 NIS 或 ldap 或誰知道呢)進行。有標準工具可以為您處理所有這些。在這種情況下,passwd

-S, –status 顯示賬戶狀態資訊。狀態資訊由 7 個欄位組成。第一個欄位是使用者的登錄名。第二個欄位指示使用者帳戶是否具有鎖定密碼 (L)、沒有密碼 (NP) 或具有可用密碼 (P)。第三個欄位給出了最後一次密碼更改的日期。接下來的四個欄位是密碼的最短使用期限、最長使用期限、警告期限和非活動期限。這些年齡以天表示。

所以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手動編輯。

引用自:https://unix.stackexchange.com/questions/479117