Dav*_*Dav 6 linux bash users regular-expression
目标:检查/etc/shadow
用户密码是否被锁定,即 /etc/shadow 中包含用户散列密码的第二个字段中的第一个字符是否为感叹号 ('!')
所需的输出:一个名为$disabled
“真”或“假”的变量
用户名在$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"`
Run Code Online (Sandbox Code Playgroud)
这是一个脚本片段,它将由 Cron 以 root 权限运行,因此可以访问所有需要的信息。
mar*_*elm 26
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
Run Code Online (Sandbox Code Playgroud)
这同样适用于锁定用户的密码;这最好通过usermod
(--lock
选项)完成,而不是shadow
手动编辑。
为什么不直接用 awk 来完成这一切呢?
awk -F: '/<username>/ {if(substr($2,1,1) == "!"){print "True"} else {print "False"}}' /etc/shadow
Run Code Online (Sandbox Code Playgroud)