
chage 是设置单个用户密码过期策略的核心命令,但直接敲 chage -M 90 username 并不能让所有新用户自动继承该策略——它只改当前用户。真正起效的,是 `/etc/login.defs` 配置 + chage 补漏 + PAM 模块协同。
如何用 chage 快速修改已有用户的密码有效期
这是最常用、最直接的操作,适合运维人员临时调整或批量脚本处理。
-
chage -M 90 -m 7 -W 14 username:设密码最多用 90 天、最少隔 7 天才能改、到期前 14 天开始警告 -
chage -d 0 username:强制用户下次登录必须改密码(last password change被设为 epoch 时间 0) -
chage -E 2026-12-31 username:账户级硬截止(注意不是密码过期,是整个账号禁用) - 执行后务必用
chage -l username核对输出,重点看Password expires和Account expires两行是否符合预期 - 常见错误:把
-M设成0或负数,会导致密码立即过期;设成99999或10000才算“永不过期”,-1在-M上无效
为什么改了 /etc/login.defs 新建用户还是不生效
因为部分发行版(如较新 Ubuntu)默认不读取 PASS_MAX_DAYS 等字段,而是依赖 PAM 的 pam_pwquality.so 或 pam_unix.so 行为。
- 先确认创建用户时是否调用了
useradd:只有useradd(非adduser交互脚本)会严格读取/etc/login.defs - 检查
/etc/login.defs中的PASS_MAX_DAYS、PASS_MIN_DAYS、PASS_WARN_AGE是否已取消注释并设值(如PASS_MAX_DAYS 90) - 若用
adduser,它可能绕过/etc/login.defs,此时需在/etc/adduser.conf中同步配置ADD_USER_CMD或直接改用useradd - 新建用户后立刻运行
chage -l newuser,如果Maximum number of days between password change显示99999,说明/etc/login.defs没被读取
密码过期但用户无法改密码?检查 PAM account 堆栈
即使 chage 设置正确,用户登录后仍提示 Your password has expired. You must change it now. 却卡在无 TTY 环境(如 SSH 非交互式连接、cron 任务),本质是 PAM account 类型模块未启用过期检查。
- 打开
/etc/pam.d/sshd(或/etc/pam.d/login),确认存在这一行:account required pam_unix.so - 缺这行会导致系统跳过
/etc/shadow中的过期字段校验,用户永远收不到过期提示,或提示了却无法触发改密流程 - 某些最小化安装(如 Alpine、CoreOS)默认不启用该模块,需手动添加
- 验证方式:用普通用户 SSH 登录一个已过期密码的账号,如果直接拒绝登录(而非弹出改密提示),大概率是 account 模块缺失
强制首次登录改密后,密码策略为何没生效
执行 passwd --expire username 或 chage -d 0 username 后,用户确实会被迫改密,但新密码仍可能绕过复杂度要求——问题出在 PAM password 堆栈顺序和模块类型上。
-
pam_pwquality.so必须放在pam_unix.so之前,否则pam_unix.so先写入密码,pam_pwquality.so的校验就失效了 - 在
/etc/pam.d/common-password(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS)中,确保类似这行在靠前位置:password requisite pam_pwquality.so minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 - 避免混用
pam_cracklib.so和pam_pwquality.so,二者功能重叠且冲突,现代系统推荐只用后者 - 改完配置后无需重启服务,PAM 规则即时生效;但已启动的 shell 进程不会重新加载,需新开终端测试
chage 参数本身简单,但真正落地时,/etc/login.defs 决定默认值、PAM account 模块决定是否检查、PAM password 模块决定是否强制复杂度——三者缺一不可。最容易被忽略的是 PAM account 行的缺失,它会让所有过期策略变成“纸上谈兵”。


















