chage -M 90 仅设置密码最长有效期,不强制改密;真正强制需配合 chage -d 0 使密码立即过期,下次登录触发修改。

chage -M 90 是核心操作,但只执行这一步**不会自动触发强制修改**——用户仍可登录,只是会收到改密提示;真正“强制修改”需要配合 chage -d 0 或密码已过期状态。
为什么 chage -M 90 本身不强制改密
该参数仅设置“密码最长可用天数”,到期后系统行为取决于当前密码最后修改时间(/etc/shadow 第3字段)与 -M 的差值。若用户密码是昨天刚设的,哪怕 -M 90 已生效,也还要等满90天才触发强制流程。
常见误解:以为设了 -M 90 就等于“90天后自动锁账户并逼用户改密”。实际它只控制密码有效性,不干预登录能力。
-
-M 90生效前提是用户密码已有明确的“最后修改日期”(即 shadow 第3字段非空) - 新创建用户或刚用
passwd改过密的用户,第3字段会被写入当前时间,-M才开始倒计时 - 若第3字段为
0(比如用chage -d 0设置过),则下次登录立即强制改密,和-M值无关
如何让“90天后强制修改”真正落地
必须组合使用两个动作:先设策略,再重置密码计时起点。
- 对现有用户:先运行
chage -M 90 username,再运行chage -d 0 username—— 后者把 shadow 第3字段设为 0,使系统认定“密码已过期”,下次登录即强制改密 - 对新用户:在
/etc/login.defs中设PASS_MAX_DAYS 90,但该配置**只影响 useradd 创建的用户**,且第3字段初始为 0,所以首次登录仍会强制改密 - 避免漏掉系统账号:批量操作时用
getent passwd | awk -F: '$3 >= 1000 {print $1}'筛选普通用户,跳过root、daemon等 UID
chage -l 查看结果怎么看是否生效
执行 chage -l username 后重点核对三行:
-
Last password change:应为具体日期(如
Aug 29, 2026)或password must be changed;若显示never,说明第3字段为空,-M不起作用 -
Password expires:应为
Nov 27, 2026(即 Last change + 90 天),不是never -
Minimum number of days between password change:若为
0,表示允许立刻再改;若设成7,则改密后7天内无法再次修改
注意:Password inactive 这一行默认是 never,除非你显式设了 -I;它和“强制修改”无关,只控制过期后还能登录多久。
容易被忽略的兼容性细节
某些场景下 chage 设置会被绕过:
- Web 应用(如 Jenkins、GitLab)若用自建用户体系或 LDAP 认证,不读取
/etc/shadow,chage完全无效 - SSH 密钥登录用户不受
chage影响——只要密钥有效,即使密码过期也能登录;需额外禁用密码认证(PasswordAuthentication no)或结合 PAM 模块限制 - LDAP 环境中,
pwdMaxAge单位是秒(90 天 =7776000),且必须绑定到用户条目,不能只配在 OU 层级
真正起作用的永远是 /etc/shadow 第5字段(最大天数)和第3字段(最后修改日)的组合,其他所有命令和配置最终都在改这两处。


















