Linux运维中定期扫描密码临期账号的核心是用chage设全局策略(PASS_MAX_DAYS 90、WARN_AGE 14)、脚本解析/etc/shadow计算剩余天数、按阈值筛选并邮件通知,辅以日志记录和人工复核。

Linux 运维中定期扫描全服检测密码即将过期的账号,核心是结合 chage 获取策略、用脚本计算剩余天数、按阈值筛选并触发通知。不依赖外部工具,纯系统命令即可落地。
设置统一密码策略基础
确保所有新用户默认遵循安全周期,避免后期逐个补设:
- 编辑
/etc/login.defs,设全局策略:PASS_MAX_DAYS 90(密码最长有效期)PASS_WARN_AGE 14(提前14天警告)PASS_MIN_DAYS 1(最短修改间隔) - 对已有用户批量应用(如普通用户 UID ≥ 1000):
awk -F: '$3 >= 1000 {print $1}' /etc/passwd | xargs -I{} chage -M 90 -W 14 {}
编写扫描脚本识别临期账号
以下为可直接保存运行的 Bash 脚本(如 /usr/local/bin/check_pwd_expiry.sh),它跳过系统账户、过滤无效条目,并输出剩余天数:
#!/bin/bash
today=$(date +%s)
warn_days=7 # 定义“即将过期”为7天内
<p>while IFS=: read -r user <em> uid </em> <em> </em> _; do
[[ $uid -lt 1000 ]] && continue # 跳过系统账号
[[ ! -f "/etc/shadow" || "$(grep "^$user:" /etc/shadow 2>/dev/null)" = "" ]] && continue</p><h1>获取密码过期日期(shadow第5字段是最大有效期天数,第3字段是上次修改日)</h1><p>lastchg=$(grep "^$user:" /etc/shadow | cut -d: -f3)
maxdays=$(grep "^$user:" /etc/shadow | cut -d: -f5)</p><p>[[ "$lastchg" = "" || "$maxdays" = "" || "$lastchg" = "0" || "$maxdays" = "99999" ]] && continue</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill4570" title="linux-performance-analyzer"><img
src="https://img.php.cn/upload/skill/000/000/081/179013069298656.jpg" alt="linux-performance-analyzer" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill4570" title="linux-performance-analyzer">linux-performance-analyzer</a>
<p>Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。</p>
</div>
<a href="/xiazai/skill4570" title="linux-performance-analyzer" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>expire_sec=$(( (lastchg + maxdays) * 86400 ))
remain_days=$(( (expire_sec - today) / 86400 ))</p><p>if [[ $remain_days -le $warn_days && $remain_days -ge 0 ]]; then
echo "$user $(date -d @$expire_sec +%Y-%m-%d) ($remain_days days left)"
fi
done < /etc/passwd运行后输出示例:alice 2026-09-22 (6 days left)bob 2026-09-19 (3 days left)
配置定时任务与邮件通知
让脚本每天自动执行,并只在发现临期账号时发邮件(避免空报):
- 添加到 root 的 crontab:
0 8 * * * /usr/local/bin/check_pwd_expiry.sh | grep -q "." && /usr/local/bin/check_pwd_expiry.sh | mail -s "⚠️ 密码即将过期提醒($(hostname))" admin@example.com - 若需更规范的邮件内容,可用
echo -e "Hi,\n以下账号密码将在7天内过期:\n$(/usr/local/bin/check_pwd_expiry.sh)" | mail ... - 建议同时记录日志:
0 8 * * * /usr/local/bin/check_pwd_expiry.sh >> /var/log/pwd_expiry_check.log 2>&1
补充验证与人工兜底机制
自动化不能替代判断,需配套简单复核手段:
- 快速查看所有用户过期时间(含“never”):
for u in $(awk -F: '$3>=1000 {print $1}' /etc/passwd); do printf "%-12s → " "$u"; chage -l "$u" 2>/dev/null | grep "Password expires" | cut -d: -f2-; done | column -t - 对输出中显示
never或99999的用户,手动确认是否确属服务账户或需重设策略 - 每月人工抽查 3–5 个临期账号,执行
chage -l username验证脚本结果一致性

















