服务器自动化巡检脚本核心是标准化检查项、自动化采集、结构化分析与可读性输出,需覆盖资源使用、服务状态、异常登录、开放端口、SUID/SGID文件、空密码账户、内核参数等关键安全指标,用Shell函数封装检查逻辑,统一返回PASS/WARN/FAIL,生成带评分与处置建议的文本报告,并通过crontab定时执行及智能告警落地。

编写服务器自动化巡检脚本并生成安全评估报告,核心在于:标准化检查项、自动化采集、结构化分析、可读性输出。不追求功能堆砌,而要稳定、可维护、能落地。
明确巡检范围与安全检查项
先梳理哪些指标真正影响安全与稳定性,避免“为巡而巡”。常见关键项包括:
- CPU、内存、磁盘使用率(阈值建议:磁盘≥90%、内存≥85%、15分钟负载>CPU核数×2)
- 关键服务状态(sshd、nginx、mysql等是否运行且监听正确端口)
- 异常登录记录(/var/log/secure 或 journalctl 中的 Failed password、Invalid user)
- 未授权开放端口(netstat -tuln | grep ‘LISTEN’ 后排除白名单端口)
- SUID/SGID 文件(find / -perm -4000 -o -perm -2000 2>/dev/null)
- 系统用户与空密码账户(awk -F: ‘$2==”" {print $1}’ /etc/shadow)
- 内核参数与SELinux状态(sysctl net.ipv4.ip_forward、getenforce)
用 Shell + 标准工具实现轻量自动化
无需引入复杂框架,纯 Bash 即可完成大部分巡检。关键是把检查逻辑封装成函数,统一返回码和输出格式:
- 每个检查项写成独立函数(如 check_disk_usage、check_ssh_bruteforce)
- 函数内用 if/else 判断,并用 echo 输出 “PASS | WARN | FAIL” + 简明描述
- 所有输出重定向到临时日志文件,带时间戳(如 /tmp/audit_$(date +%s).log)
- 用 date、hostname、uname -r 等命令开头记录环境信息,便于追溯
示例片段:
check_root_login() {
if grep -q "Failed password.*root" /var/log/secure 2>/dev/null; then
echo "FAIL | 检测到 root 账户暴力破解尝试,请检查 /var/log/secure"
else
echo "PASS | 未发现近期 root 登录失败记录"
fi
}
生成结构化安全评估报告
巡检完成后,将原始输出转为易读报告。推荐用纯文本+简单标记,兼顾机器解析与人工查阅:
- 用 awk 或 sed 提取每行的 “PASS/WARN/FAIL”,统计各状态数量
- 将 FAIL 和 WARN 条目单独提取,作为【高危项】和【建议项】章节
- 加入评分逻辑(如:满分100,每项FAIL扣10分,WARN扣3分),给出综合得分与等级(A/B/C)
- 最后附上【处置建议】:对每个 FAIL 给出 1~2 行可操作命令(如 “执行 faillog -u root -r 清除失败记录”)
输出保存为 /opt/reports/sec_audit_$(hostname)_$(date +%Y%m%d).txt,同时保留最近7天报告供比对。
定时执行与结果通知
让巡检真正“自动”,需解决触发与反馈:
- 用 crontab 每日凌晨2点执行(0 2 * * * /opt/scripts/sec_audit.sh >> /dev/null 2>&1)
- 脚本末尾加邮件发送逻辑:检测到 FAIL 时,用 mail 或 curl 调用企业微信/钉钉机器人推送摘要(含主机名、FAIL 数、报告路径)
- 避免告警疲劳:同一问题连续3次出现才触发通知,或通过 diff 上次报告跳过重复项
不复杂但容易忽略:所有脚本开头加 set -e,确保任一命令失败即终止;敏感操作(如清日志)默认只打印命令不执行,加 --apply 参数才生效。

















