chage -M 设置密码最长有效期仅对已有用户生效,需用该命令更新/etc/shadow第5字段,/etc/login.defs仅影响新用户;-E设账号失效日期(第8字段),-W设过期前警告天数(第6字段)。

chage -M 设置密码最长有效期
对已有用户改密码过期天数,必须用 chage -M,不能靠改 /etc/login.defs。后者只影响新创建的用户,改完也不会刷新老用户的 /etc/shadow 记录。
比如让用户 alice 的密码 60 天后过期:
sudo chage -M 60 alice
执行后立刻生效,/etc/shadow 第 5 字段(MAX_DAYS)会被更新。注意:这个值是从“最后一次改密时间”起算,不是从命令执行时刻起算——chage -d 才控制那个基准点。
- 如果想重置计时起点(比如刚重设密码,希望从今天开始算 60 天),要搭配
chage -d $(date +%Y-%m-%d) alice -
-M 0表示密码立即过期,下次登录强制改密;-M 99999等效于永不过期 - 普通用户无法给自己设
-M,只有 root 或 sudo 权限能操作
chage -E 设置账号整体失效日期
chage -E 控制的是账号本身是否还能登录,和密码是否过期是两回事。它写入 /etc/shadow 第 8 字段(EXPIRE_DATE),格式为 YYYY-MM-DD。
例如让 bob 账号在 2026-12-31 后彻底禁用:
sudo chage -E "2026-12-31" bob
这个日期一到,无论密码是否有效,bob 都无法登录(passwd -S bob 会显示 Account expired)。常见误区是以为 -E 和 -M 是同一机制——其实 -E 优先级更高,账号已过期时,密码再有效也没用。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 设成空字符串(
chage -E "" bob)或chage -E -1 bob可清除该限制 - 日期格式必须严格为
YYYY-MM-DD,多空格、少横线都会报错:chage: invalid date format -
chage -l bob输出里 “Account expires” 这一行对应的就是-E的值
chage -W 设置过期前警告天数
用户登录时看到 “You are required to change your password immediately” 或 “Your password will expire in X days”,背后就是 chage -W 设定的提前通知窗口。
比如希望用户在密码到期前 14 天开始收到提示:
sudo chage -W 14 alice
这个值写进 /etc/shadow 第 6 字段(WARN_DAYS),但实际是否显示取决于 PAM 配置和 shell 类型。bash 用户基本都能看到,zsh 或某些精简环境可能不触发。
- 警告天数不能大于
-M值,否则无效(比如-M 7 -W 10会被忽略) - 设为
0表示到期当天才提醒,1表示提前 1 天 - 如果用户已经过了密码有效期(
passwd -S显示Password must be changed),警告就不再起作用了
验证和排查常见失效原因
改完没效果?先看 /etc/shadow 里对应字段有没有真被更新,再查是否被其他策略覆盖。
运行 sudo chage -l username 是最直接的验证方式。输出中各字段对应关系如下:
- “Password expires” ← 来自
-M+-d计算结果 - “Account expires” ← 直接来自
-E - “Number of days of warning” ← 就是
-W值
容易被忽略的点:
- root 用户不受
/etc/login.defs约束,但受chage命令影响(chage -M 90 root是合法的) - 某些定制镜像或安全加固脚本会重写
/etc/pam.d/system-auth,导致chage设置被绕过 -
passwd -S和chage -l输出可能不一致:前者读/etc/shadow原始字段,后者会做逻辑推算,优先信chage -l

















