chage是Linux设置用户账户和密码有效期的唯一通用可靠命令。它通过修改/etc/shadow第7、8、9字段控制密码最大使用天数(-M)、账户过期日(-E)和宽限期(-I),避免usermod -e仅改账户到期日导致密码逻辑脱节的问题;需组合使用参数如chage -E 2025-12-31 -M 60 -W 7 username,并严禁对root盲目设-M或-E,必须确保chage -l root显示Password expires为“never”。

chage 命令改用户过期时间最直接
Linux 里设账号有效期,chage 是唯一靠谱的通用方案。它专管密码策略和账户生命周期,比手动改 /etc/shadow 安全、可逆、不易出错。
常见错误是用 usermod -e 只设账户到期日,却忽略密码过期逻辑——结果用户登录后立刻被锁,因为密码已过期但没提示重置。
-
chage -E 2025-12-31 username:设账户整体失效日期(到那天零点账户禁用) -
chage -M 90 username:设密码最长使用天数(90 天后必须改密码) -
chage -d 0 username:强制下次登录时重设密码(适合新用户或安全重置) - 组合用更稳妥:
chage -E 2025-12-31 -M 60 -W 7 username(账户年底过期、密码60天一换、提前7天警告)
/etc/shadow 字段含义决定你能控什么
账户有效期实际由 /etc/shadow 第 8、9 字段控制:expire(账户过期日,从 1970-01-01 起算的天数)和 inactive(密码过期后宽限期天数)。直接编辑这文件风险高,但得懂它,否则 chage 输出看不懂。
比如 chage -l username 显示 Account expires 为 “never”,对应 /etc/shadow 第 8 字段是空或 99999;显示 “Dec 31, 2025”,说明该字段已被写入具体数值。
- 第 8 字段为
-1或空:账户永不过期 - 第 8 字段为正整数:账户在那天之后无法登录(哪怕密码还有效)
- 第 7 字段(
max)为99999:密码永不过期;为0:密码立即过期(需立刻重设)
批量设置要绕开 usermod -e 的陷阱
usermod -e 看似简单,但它只动 /etc/shadow 第 8 字段,不碰密码策略字段。批量脚本里如果只用它,会导致一批用户账户到期但密码还“合法”,系统行为不一致——有的被锁,有的还能登但无法执行 sudo。
真正批量操作,必须用 chage 并显式指定所有关键参数,避免依赖默认值。
- 给多个用户统一设账户 2025 年底过期、密码 45 天一换:
for u in alice bob carol; do chage -E 2025-12-31 -M 45 "$u"; done - 检查是否生效:
chage -l alice | grep -E "(Account|Password) expires" - 别用
date +%Y-%m-%d拼字符串传给-E——chage不认带空格或时区的格式,必须是严格YYYY-MM-DD
root 用户不能被 chage 锁死
对 root 执行 chage -E 或 -M 是允许的,但后果很实在:一旦 root 密码过期且没设宽限期,你可能失去系统最高权限入口。这不是 bug,是设计使然。
运维中真有团队误设 root 密码 30 天过期,又没配 SSH key 登录,结果某天凌晨自动锁死,只能进单用户模式救。
- 除非有完整密钥+console 访问兜底,否则不要给
root设-M或-E - 如必须限制,至少加
-I 30(密码过期后 30 天内仍可登录,但每次提醒改密) -
chage -l root应始终显示Password expires为 “never”,这是生产环境底线
chage -l 得定期核对,尤其在交接或批量操作后。字段间耦合紧,改一个常牵出另一个逻辑失效。

















