最可靠方法是用chage命令设置单个用户密码过期时间;/etc/login.defs仅影响新建用户,已有用户需单独执行chage -m 90等命令处理,-m控制密码有效期,-e控制账户截止日,二者不可混淆。

直接结论:用 chage 命令设置单个用户密码过期时间最可靠,/etc/login.defs 只影响新建用户,已有用户必须单独处理。
chage -M 设置密码最长有效期(最常用)
这是管理员日常操作频率最高的动作。比如要求用户每 90 天必须换一次密码:
chage -M 90 username
注意:-M 参数只控制“密码本身过期”,不是账户失效;过期后用户仍可登录,但会被强制改密。常见错误是误以为设了 -M 就锁死了账户——其实没锁,得配合 -I 或 -E 才行。
几个关键点:
-
-M 0表示密码立即过期,用户下次登录就必须改密(等效于chage -d 0 username) -
-M -1或-M 99999表示密码永不过期(慎用,不符合等保或内部安全策略) - 普通用户执行会报错
Permission denied,必须用sudo或 root 权限
chage -W 和 -I 配合使用防漏登
只设 -M 不够,用户可能忽略警告、拖到过期当天才想起来。加 -W 提前通知,再用 -I 控制宽限期:
chage -W 7 -I 14 username
这表示:密码到期前 7 天开始提示;过期后还能再登录 14 天,但每次登录都必须改密;第 15 天起账户被锁定,无法登录。
容易踩的坑:
-
-I值设为0意味着“密码一过期就立刻锁账户”,用户来不及响应,易引发运维求助 -
-I和-E是两回事:-E锁的是整个账户(连登录都不让),-I锁的是密码有效性(允许登录但必须改密) - 如果同时设了
-I 14和-E "2026-12-31",以先触发者为准——比如密码在 12 月 1 日过期,-I给 14 天宽限,但账户在 12 月 10 日就因-E到期而彻底禁用
/etc/login.defs 只管新用户,老用户不受影响
很多人编辑完 /etc/login.defs 里的 PASS_MAX_DAYS 90 就以为万事大吉,结果发现已有用户密码还是永远不提醒。这是因为该文件仅对 useradd 创建的新用户生效。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
验证方式很简单:
chage -l username
输出里 Maximum number of days between password change 这一行,如果是 99999 或空,说明该用户没继承 /etc/login.defs 的设置。
所以正确流程是:
- 先改
/etc/login.defs,确保后续新增用户合规 - 再批量跑一遍
chage -M 90修复存量用户(可用awk -F: '$3 > 999 {print $1}' /etc/passwd | xargs -n1 chage -M 90筛出非系统账号处理) - 别忘了用
chage -d 0强制高风险账号(如刚入职或权限变更的)首次登录即改密
账户真正锁定靠 -E,不是 -M
有些场景需要硬性关停某个账号(比如员工离职、外包结束),这时不能只依赖密码过期,必须用 -E 设定账户截止日:
chage -E "2026-06-30" ex_employee
一旦过了这个日期,无论密码是否有效、是否已改密,ex_employee 都无法登录系统,ssh、su、login 全部拒绝。
注意:
-
-E接受YYYY-MM-DD格式或天数(从 1970-01-01 起算),推荐用日期格式,避免计算错误 -
-E 0表示“账户已过期”,即刻禁用;-E -1表示永不过期 -
chage -l输出中Account expires这一项就是-E的效果,务必和Password expires区分开
真正要命的细节是:-M 和 -E 看似都叫“过期”,但一个管密码,一个管账户,底层机制完全不同。混淆这两者,会导致安全策略形同虚设——比如只设了 -M 却没设 -E,离职人员只要记得旧密码,依然能登录。










