passwd -s输出7字段:用户名、密码状态(p/l/np)、最后修改日期、最小有效期、最大有效期、过期前警告天数、过期后宽限期;通过第2字段可快速识别锁定(l)或无密码(np)账户,结合第3、5字段可推算密码过期日,适合高效巡检。

/etc/shadow 最准,但得自己算日期;用 chage -l 最直观,但慢;passwd -S 适合快速筛查——三者权限要求一致,都必须用 sudo 或 root。
怎么用 chage -l 批量查所有用户
chage -l 输出带自然语言日期(如 Password expires : Aug 12, 2026),人眼可读性强,但对每个用户都要调一次系统调用,用户多时明显卡顿。
实际执行建议:
- 只查非系统账户:用
getent passwd | awk -F: '$3 >= 1000 {print $1}'过滤 UID ≥1000 的普通用户,避开root、daemon等 - 加
2>/dev/null屏蔽权限不足用户的报错(比如某些 LDAP 用户无法被本地chage解析) - 别用
for user in $(cat /etc/passwd | cut -d: -f1)—— 会把nobody、systemd-network全扫一遍,且空格/特殊字符用户名会崩
推荐一行命令:
sudo getent passwd | awk -F: '$3 >= 1000 {print $1}' | while read u; do echo -n "$u: "; sudo chage -l "$u" 2>/dev/null | grep 'Password expires' | cut -d: -f2; done | sed 's/^ *//'
为什么 passwd -S 更适合巡检筛选
passwd -S 输出固定 6 列,字段紧凑、无换行、无本地化日期,脚本解析友好。关键字段是第 3 列(最后修改日)和第 5 列(最大有效期天数),两者相加就能算出过期日。
常见陷阱:
- 第 3 列是 MM/DD/YYYY 格式(不是 YYYY-MM-DD),
date -d能认,但用awk直接拆分容易错位 - 输出中状态码为
L(锁定)或NP(无密码)时,后面日期字段可能为空或无效,需先过滤 - 服务账户(如
mysql、redis)常设PASS_MAX_DAYS 99999,passwd -S显示99999,但实际策略由/etc/login.defs中的PASS_MAX_DAYS控制
快速标出 7 天内过期的用户:
sudo passwd -S | awk '$2 == "P" && $4 > 0 && $5 > 0 {cmd = "date -d \"" $3 " + " $5 " days\" +%Y-%m-%d 2>/dev/null"; cmd | getline exp; close(cmd); if (exp != "" && exp
<h3>直接解析 /etc/shadow 字段要注意什么</h3>
<code>/etc/shadow</code> 第 3 列是上次改密距 epoch 天数(如 <code>19823</code>),第 5 列是最大有效期天数(<code>90</code>),两者相加就是过期日距 epoch 天数。但第 8 列(账户绝对过期日)优先级更高——如果它非空且小于当前日期,账户已锁死,密码过期与否都不影响登录。
<p>关键细节:</p>
- 第 3 列为
0表示“密码从未设置”,不是“刚改密”,此时第 5 列无效 - 第 5 列为
99999或空(即::)表示永不过期,但需结合/etc/login.defs中的全局PASS_MAX_DAYS -
date -d "1970-01-01 +19823 days"在部分老系统(glibc perl -e 'print scalar localtime(19823*86400)."\n"' 替代
哪些用户根本不会走 shadow 密码过期逻辑
LDAP、AD、SSSD 或 Samba 用户不依赖本地/etc/shadow,他们的过期策略由远端目录服务控制。chage 和 passwd -S 对这类用户返回 password status is unknown 或直接失败。
识别方式:
-
getent shadow username返回空,但getent passwd username有结果 → 很可能是远程用户 -
id username显示 GID/UID 来自非本地源(如domain users) -
authconfig --test | grep -i ldap或sssd --version可确认是否启用集中认证
ldapsearch、ipa user-show 或 smbstatus,不能只靠本地命令硬扫。











