直接给用户设密码过期提醒靠chage -w,必须小于-m且密码有实际到期日才生效;设完立即生效,仅交互式登录时显示提示,不发邮件、不弹窗。

直接给用户设密码过期提醒,靠的是 chage -W,不是改配置文件或装新工具——设完立刻生效,登录时就显示提示。
chage -W 的值必须比 -M 小,否则不触发
系统只在“剩余有效期 ≤ -W 值”且密码真有到期日时才提示。常见错误是只设 -W 7 却没设 -M,结果 chage -l 显示 “Password expires: never”,提醒永远不会出现。
-
sudo chage -M 90 -W 7 alice:密码 90 天后过期,提前 7 天起每次登录都提示 -
sudo chage -W 0 alice:禁用提醒(不是“当天提醒”,是彻底不提示) -
sudo chage -W -1 alice:多数发行版视为无效,行为不可靠,别用 - 查当前设置:
chage -l alice→ 看 “Number of days of warning before password expires” 字段
/etc/login.defs 只影响新用户,老用户得单独跑 chage
改了 PASS_WARN_AGE 7 后新建的用户自动带提醒,但已有用户完全不受影响。想批量补上,得用脚本或命令行筛出普通用户再挨个设:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 只处理 UID ≥ 1000 的用户:
getent passwd | awk -F: '$3 >= 1000 {print $1}' | xargs -I{} sudo chage -W 7 {} - 避免误操作系统账号:
awk -F: '$3>=1000 && $1 !~ /^(root|sync|shutdown|halt|operator|nobody)$/ {print $1}' /etc/passwd -
/etc/login.defs中的PASS_WARN_AGE不会覆盖已有用户的chage设置,只作为 useradd 的默认值
提醒只在交互式登录时出现,免密登录和 root 不显示
这是最容易被忽略的限制:SSH 密钥登录、cron、systemd service、su 切换用户都不会触发该提示。只有用户输入密码完成完整登录流程(比如 ssh 用户名@主机、TTY 输入密码、图形界面密码框),且 shell 是交互式的(bash/zsh),才会看到那行 “Your password will expire in X days.”
- root 用户通常被跳过,即使
chage -W设了也不提示 - 提示出现在 motd 或 welcome banner 之后、shell 提示符之前,一闪而过,容易被忽略
- 如果用户用
ssh -o PasswordAuthentication=no连接,就算密码快过期,也完全看不到提醒
想让提醒更醒目?得自己加 PAM 脚本,原生不支持高亮或邮件
chage -W 只控制终端文字提示的触发逻辑,不发邮件、不弹窗、不改颜色。要真正“强提醒”,必须额外介入:
- 写一个
/usr/local/bin/pw-expiry-notice.sh,用chage -l算剩余天数,输出带 ⚠️ 和换行的提示 - 在
/etc/pam.d/sshd末尾加:session optional pam_exec.so stdout /usr/local/bin/pw-expiry-notice.sh - 邮件提醒必须另配:写脚本遍历用户、算
days_left、调mail或sendmail,再用 cron 每天跑一次 - 注意:PAM 脚本对非交互式登录(如 scp、rsync over ssh)也可能执行,需在脚本里加
[ -t 1 ]判断是否为终端
真正麻烦的不是设 -W,而是确认它在哪种登录路径下有效、哪种场景下失效,以及怎么补足那些原生机制管不到的地方。










