使用chage -w设置密码过期警告天数,并结合/etc/login.defs全局配置和pam调用脚本实现登录强提醒;需确保交互式登录、非零warndays值、非系统账户及终端支持ansi颜色。

直接用 chage -W 设置警告天数,再配合系统级默认配置和登录时的醒目提示,就能让提醒真正起作用。
单个用户设置 WarnDays
用 chage -W 指定密码过期前多少天开始提醒。比如提前 7 天警告:
sudo chage -W 7 username- 执行后,该用户的
/etc/shadow第 6 字段(warn)会被写入 7 - 用
sudo chage -l username确认输出中 “Password expires” 和 “Warning before password expires” 两行都显示有效值
新用户统一启用警告提醒
避免每次建用户都手动设,把规则写进全局配置文件:
- 编辑
/etc/login.defs - 确保包含这行:
PASS_WARN_AGE 7(或你希望的天数,如 14) - 该设置只对新建用户生效;已有用户需单独运行
chage -W
让提醒在登录时真正被看到
Linux 默认的文本提示容易被忽略。要实现“强提醒”,需两步结合:
- 确认 PAM 配置已加载
pam_pwquality.so或pam_unix.so,保证密码过期检查在认证阶段触发 - 在
/etc/pam.d/sshd或/etc/pam.d/login中添加一行:session optional pam_exec.so stdout /usr/local/bin/warn-password-expiry.sh - 脚本里用
chage -l $PAM_USER | grep "Password expires"判断剩余天数,并用 ANSI 颜色高亮 输出,例如:echo -e "\033[1;31m⚠ Your password expires in ${days} days!\033[0m"
验证与排查常见问题
提醒没出现?重点检查这几项:
- 用户不是通过交互式 Shell 登录(如 cron、scp、非 tty 连接),这类场景不会触发 session 类 PAM 提示
-
chage -W设为 0 或负数,会导致无警告;设为 -1 是无效值,部分系统会静默忽略 - 用户是系统账户(UID
- 终端不支持 ANSI 转义序列,颜色提示会失效,可改用全大写 + 多个感叹号增强可读性











