修改 /etc/login.defs 仅影响新建用户,老用户需用 chage 单独设置,因其密码策略已固化在 /etc/shadow 中,不会自动同步;PASS_MAX_DAYS 等参数生效前提是用户创建时未指定且未被 chage 覆盖。

直接改 /etc/login.defs 只影响新建用户,老用户必须用 chage 单独设置,否则策略不生效。
为什么 /etc/login.defs 修改后老用户没反应
这个文件只在创建新用户时被读取一次,用于初始化其密码策略字段(写入 /etc/shadow)。已有用户的密码过期时间、最小更改间隔等参数早已固化在 /etc/shadow 的对应字段里,不会自动同步 /etc/login.defs 的变更。
-
PASS_MAX_DAYS 90生效前提是:该用户创建时未指定过期策略,且后续没被chage覆盖 - 执行
chage -l username查看实际生效值,如果显示Password expires : never,说明该用户仍沿用默认的 99999 天 -
passwd -S username输出第二列(如PS)表示密码状态,但真正控制过期的是/etc/shadow第三、四、五字段
给已有用户设密码有效期:chage 是唯一可靠方式
必须对每个目标用户显式运行 chage,不能跳过。常见组合:
-
chage -M 90 username:设密码最长有效期为 90 天(对应/etc/shadow第 5 字段) -
chage -m 7 username:设两次改密最小间隔为 7 天(第 4 字段) -
chage -W 14 username:设过期前 14 天开始警告(第 6 字段) -
chage -d 2026-07-08 username:强制重置“最后修改日期”为当天(第 2 字段),避免因历史时间导致立即过期
注意:chage -E 设置的是账户整体过期时间(/etc/shadow 第 8 字段),和密码过期无关,别混淆。
批量设置多个用户密码过期策略
没有内置批量命令,需配合 shell 循环。例如给 dev 组所有用户设 90 天有效期:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
for u in $(getent group dev | cut -d: -f4 | tr ',' '\n'); do chage -M 90 "$u" done
关键点:
- 务必先用
chage -l $u验证单个用户是否成功,再跑批量 - 避免对
root执行chage -M,万一策略生效期间 root 密码过期又无其他管理入口,可能锁死系统 -
chage不校验密码强度,它只管时间策略;复杂度由 PAM 模块(如pam_pwquality.so)控制,两者独立
验证策略是否真正写入 /etc/shadow
别只信 chage -l 输出,直接查底层:
-
sudo grep ^username /etc/shadow,结果形如:username:$6$xxx:19920:7:90:14::: - 第 3 字段(19920)是上次改密距 1970-01-01 的天数,可用
date -d "@$(($19920 * 86400))"换算 - 第 4 字段(7)=
chage -m值,第 5 字段(90)=chage -M值,第 6 字段(14)=chage -W值 - 若某字段为
0或空,表示该策略未设置,会 fallback 到/etc/login.defs默认值
最易忽略的是:改完策略后没检查 /etc/shadow 实际内容,只看 chage -l —— 有些旧版 chage 在权限不足时会静默失败,但输出看似成功。










