chage 是唯一能安全、完整控制用户账号有效期的命令;它通过 -E 设置账户整体失效日期并写入 /etc/shadow 第8字段,同时需配合 -M 和 -W 约束密码生命周期,避免登录即锁。

chage 是唯一能安全、完整控制用户账号有效期的命令。用 usermod -e 只改账户到期日,不碰密码策略,极大概率导致用户登录后立刻被锁——因为密码已过期但没提示重设。
chage -E 设置账户整体失效日期
账户在指定日期零点后完全禁用,无论密码是否有效:chage -E 2026-12-31 alice
该操作直接写入 /etc/shadow 第8字段(expire),值为从1970-01-01起算的天数。若设为 "" 或 -1,字段清空,chage -l alice 显示 Account expires 为 never。
常见错误:
- 传入带空格或时区的日期,如
"Dec 31 2026"或2026-12-31T00:00:00Z——chage拒绝解析,静默失败 - 对
root执行chage -E后未配-I宽限期,一旦 root 密码过期,可能失去紧急访问能力
chage -M 和 -W 配合防止“登录即锁”
仅设 -E 不够,必须同步约束密码生命周期:chage -M 60 -W 7 alice 表示密码最长用60天,提前7天开始警告。
关键逻辑:
-
-W值必须小于-M,否则警告不触发 -
-M 0:密码立即过期,强制下次登录重设(适合新用户初始化) -
-M -1:密码永不过期(对应/etc/shadow第7字段为99999) - 若
-M设为正数但没配-W,用户直到登录才看到 “You are required to change your password immediately”
批量设置必须显式指定所有参数
脚本里别偷懒只用 usermod -e,它只动第8字段,留一堆密码逻辑脱节的账号:for u in alice bob carol; do chage -E 2026-12-31 -M 45 -W 5 "$u"; done
验证是否生效:chage -l alice | grep -E "(Account|Password) expires"
注意点:
- 不要用
date +%Y-%m-%d拼字符串传给-E,确保输出无空格、无换行 - 系统服务账户(如
www-data、mysql)通常不应设-M,避免定时任务因密码过期中断 - 若需统一新用户的默认策略,改
/etc/login.defs中的PASS_MAX_DAYS,不影响已有用户
查看和诊断实际生效字段
chage -l username 输出是最终依据,但得看懂它背后映射的 /etc/shadow 字段:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
Account expires→ 第8字段(expire) -
Password expires→ 由第3字段(last password change) + 第4字段(max days)推算得出 -
Password inactive→ 第7字段(inactive),即密码过期后还能登录的天数
chage -l alice 显示 Password inactive : 7,说明第7字段是 7;若显示 never,则该字段为空或 0。直接编辑
/etc/shadow 风险极高,chage 的价值正在于它校验逻辑、避免格式错位。
真正卡住人的从来不是单个命令怎么敲,而是账户禁用那一刻用户打不通电话、运维连不上机器——所以每次设 -E,务必同步确认 -M 和 -I 是否匹配业务容忍窗口。

















