BASH:如果用户密码被锁定,请检查 /etc/shadow

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手动编辑。

  • FWIW,它(错误地)在此处为我自己的(带有 LDAP 的 Kerberos)帐户报告了“L”,我想是因为它无法获取密码哈希。无论如何,`passwd -S` 对除 /etc/shadow 之外的许多身份验证方案都没有用处。 (3认同)
  • @SimonRichter 据我所知,您也需要 root 来为其他用户运行 `passwd -S`。但是,不适用于您自己的用户。 (2认同)
  • `getent passwd $ACCOUNT` 从用于身份验证的任何来源获取条目。 (2认同)

har*_*llb 3

为什么不直接用 awk 来完成这一切呢?

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