Linux
BASH:如果使用者密碼被鎖定,請檢查 /etc/shadow
**目的:**檢查
/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
手動編輯。