服务器月度巡检脚本:自动检查磁盘/内存/负载/安全/SSL证书并推送钉钉/邮箱
定期执行巡检脚本可提前识别磁盘写满、资源耗尽、安全攻击、证书过期等隐患。建议将脚本配置为cron自动运行,并通过钉钉或邮件接收报告,实现零人工干预的运维预警。
【摘要】
定期巡检是预防服务器故障的关键手段。本文提供一套完整的Shell巡检脚本,涵盖磁盘使用率、内存占用、系统负载、SSH登录失败记录及SSL证书过期时间五项核心指标。脚本可配置cron定时执行,并通过邮件或钉钉Webhook推送报告,实现自动化运维预警。
关键词: 服务器巡检, Shell脚本, 自动化运维, 钉钉告警, cron
一、 巡检指标设计
| 检查项 | 命令示例 | 告警阈值 | 作用 |
|---|---|---|---|
| 磁盘使用率 | df -h |
>80% | 避免磁盘写满导致服务中断 |
| 内存使用率 | free -m |
>90% | 排查内存泄漏或不足 |
| 系统负载 | uptime |
>CPU核心数 | 判断CPU资源是否过载 |
| SSH登录失败 | grep "Failed password" /var/log/auth.log |
大量重复IP | 检测暴力破解攻击 |
| SSL证书过期 | openssl s_client |
剩余<30天 | 防止证书过期导致HTTPS不可用 |
二、 单项检查命令
2.1 磁盘使用率
bash
df -h | grep -v "tmpfs" | awk '{if($5+0 > 80) print $0}'
过滤tmpfs,仅输出使用率超过80%的挂载点。
2.2 内存使用率
bash
free -m | awk 'NR==2{printf "%.2f\n", $3*100/$2}'
返回内存使用百分比,精确到小数点后两位。
2.3 系统负载
bash
uptime | awk -F 'load average:' '{print $2}'
输出1分钟、5分钟、15分钟的平均负载。需结合CPU核心数判断(如4核负载>4即过载)。
2.4 SSH登录失败记录
bash
grep "Failed password" /var/log/auth.log | tail -20
查看最近20条失败记录。若同一IP大量出现,应配合fail2ban或更换SSH端口。
2.5 SSL证书过期时间
bash
echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
输出证书起始日期和过期日期。Let's Encrypt自动续期偶尔失败,手动巡检可兜底。
三、 完整巡检脚本
以下脚本将上述检查项整合,按告警状态生成报告。
bash
#!/bin/bash
# 服务器月度巡检脚本
# 用法:./check_server.sh
REPORT="===== 服务器巡检报告 =====\n\n"
# 1. 磁盘使用率检查
DISK=$(df -h | grep -v tmpfs | awk '{if($5+0 > 80) print $0}')
if [ -n "$DISK" ]; then
REPORT="${REPORT}[警告] 磁盘使用率超过80%:\n$DISK\n\n"
else
REPORT="${REPORT}[OK] 磁盘使用率正常\n\n"
fi
# 2. 内存使用率检查
MEM=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2}')
if (( $(echo "$MEM > 90" | bc -l) )); then
REPORT="${REPORT}[警告] 内存使用率:${MEM}%\n\n"
else
REPORT="${REPORT}[OK] 内存使用率:${MEM}%\n\n"
fi
# 3. 系统负载
LOAD=$(uptime | awk -F 'load average:' '{print $2}')
REPORT="${REPORT}系统负载:$LOAD\n\n"
# 4. SSH登录失败检查
FAILED=$(grep "Failed password" /var/log/auth.log 2>/dev/null | tail -5)
if [ -n "$FAILED" ]; then
REPORT="${REPORT}[注意] 最近登录失败记录:\n$FAILED\n\n"
fi
# 5. SSL证书过期时间(需替换为实际域名)
CERT_EXPIRE=$(echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
REPORT="${REPORT}SSL证书过期时间:$CERT_EXPIRE\n\n"
echo -e "$REPORT"
四、 自动化配置
4.1 cron定时任务
每月1号上午8点执行,结果通过邮件发送:
bash
crontab -e
0 8 1 * * /home/deploy/check_server.sh | mail -s "Server Monthly Report" admin@example.com
4.2 钉钉群机器人推送
更实时的方案是将报告推送到钉钉群。在脚本末尾添加以下逻辑:
bash
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN"
MESSAGE=$(echo -e "$REPORT" | sed ':a;N;$!ba;s/\n/\\n/g')
curl -X POST $WEBHOOK -H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MESSAGE\"}}"
五、 实战案例
某次巡检发现磁盘使用率达85%,排查发现MySQL binlog占用40GB,原因为测试后未关闭binlog。清理后磁盘降至30%。两个月后遭遇突发流量,因磁盘余量充足未发生故障。自此巡检频率调整为每周一次。
六、 服务器环境建议
巡检脚本需部署在稳定运行的服务器上。若尚未购买服务器,可使用Ztopcloud轻量应用服务器(香港节点),支持邮箱注册免实名、微信支付宝充值,开通后直登阿里云/腾讯云官方控制台,部署简单。
七、 总结
定期执行巡检脚本可提前识别磁盘写满、资源耗尽、安全攻击、证书过期等隐患。建议将脚本配置为cron自动运行,并通过钉钉或邮件接收报告,实现零人工干预的运维预警。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)