Linux系统需通过chage设定警告期、自定义脚本检查并发送邮件、cron定时执行三步实现密码过期前7天邮件提醒;chage -W 7仅设警告阈值,不发邮件。

Linux系统本身不自动发邮件提醒密码过期,但可以通过 chage 策略 + 自定义脚本 + cron 定时任务 三步组合实现“提前7天发邮件”这一目标。关键不是靠单一配置,而是让系统主动检查、计算、通知。
一、先用 chage 设定每个用户的“7天警告期”
chage 的 -W 参数 就是专门控制“提前多少天开始警告”的,它不发邮件,但为后续脚本提供判断依据:
- 给单个用户设置:sudo chage -W 7 username
- 批量设置(如所有 UID ≥1000 的普通用户):
for u in $(awk -F: '$3>=1000 && $3 - 验证是否生效:chage -l username → 查看输出中 “Password warning period” 是否为 7 days
二、写一个检查并发送邮件的脚本
脚本核心逻辑:遍历用户 → 用 chage -l 获取过期日期 → 计算剩余天数 → 若 ≤7 天且未过期 → 发邮件给该用户。示例片段如下:
- 保存为 /usr/local/bin/check_pw_expiry.sh,确保可执行(chmod +x)
- 脚本内需调用 mail 命令,提前确认系统已安装并能发信(如 Ubuntu 装 mailutils,CentOS 装 mailx)
- 关键判断行示例:
days_left=$(( ($(date -d "$expire_date" +%s) - $(date +%s)) / 86400 ))
if [ "$days_left" -ge 0 ] && [ "$days_left" -le 7 ]; then
echo "您的密码将在 $days_left 天后过期,请及时修改。" | mail -s "密码即将过期提醒" "$u@yourdomain.com"
fi
三、用 crontab 每天自动运行脚本
让提醒真正“自动”,必须靠定时任务。推荐每天固定时间执行一次:
- 以 root 身份编辑定时任务:sudo crontab -e
- 添加一行:
0 9 * * * /usr/local/bin/check_pw_expiry.sh > /dev/null 2>&1
表示每天上午 9 点执行,> /dev/null 2>&1 避免日志刷屏 - 如需测试,可临时改成每分钟执行:* * * * * /usr/local/bin/check_pw_expiry.sh(测试完务必改回)
四、补充建议:让提醒更可靠
仅靠用户邮箱可能漏收,建议多一层保障:
- 脚本中同时抄送管理员邮箱(如用 -c 或额外 mail 命令),例如:
echo "...$u 密码还剩 $days_left 天" | mail -s "【密码告警】" -c admin@company.com "$u@company.com" - 避免对系统账号(如 daemon、sys)发信,脚本里加 UID 过滤或白名单
- 首次部署后,手动运行脚本一次(sudo /usr/local/bin/check_pw_expiry.sh),确认邮件能发出、内容无误


















