在大型服务器集群管理中,自动化巡检脚本已成为运维工程师的核心工具。据2024年运维报告显示,使用自动化巡检的系统故障恢复时间平均缩短78%。本文将分享20个经过生产环境验证的复杂巡检脚本,涵盖性能、安全、容器、网络等核心场景。
一、基础资源巡检类
1. 全维度资源概览脚本
#!/bin/bash
# 文件名:full_system_check.sh
LOG="/var/log/full_system_$(date +%F).log"
echo"===== 系统基础信息 =====" > $LOG
echo"主机名: $(hostname)" >> $LOG
echo"OS版本: $(grep PRETTY_NAME /etc/os-release | cut -d\" -f2)" >> $LOG
echo"内核版本: $(uname -r)" >> $LOG
echo"启动时间: $(uptime -s)" >> $LOG
echo -e "\n===== CPU使用率TOP5 =====" >> $LOG
ps -eo pid,user,%cpu,cmd --sort=-%cpu | head -6 >> $LOG
echo -e "\n===== 内存消耗TOP5 =====" >> $LOG
ps -eo pid,user,%mem,cmd --sort=-%mem | head -6 >> $LOG
echo -e "\n===== 磁盘空间告警检测 =====" >> $LOG
df -h | awk '$5 > 80 {print $6 " 使用率: " $5}' >> $LOG
用法:chmod +x full_system_check.sh && ./full_system_check.sh
输出:生成/var/log下的日志文件,包含关键资源阈值检测
2. 动态资源实时监控脚本
#!/bin/bash
# 文件名:realtime_monitor.sh
echo"监控开始,按Ctrl+C退出"
while :
do
clear
echo"$(date +%T) 实时监控"
echo"-----------------------------------"
echo"** CPU负载 **"
top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print "空闲率: " 100-$1 "%"}'
echo -e "\n** 内存压力 **"
free -m | awk 'NR==2{printf "已用/总量: %sMB/%sMB (%.2f%%)\n", $3,$2,$3*100/$2}'
echo -e "\n** 磁盘IO **"
iostat -dx 2 3 | awk '/sd[a-z]/ {print $1 " 平均等待: " $10 "ms 利用率: " $14 "%"}' | tail -n3
sleep 5
done
用法:直接执行,动态刷新系统核心指标
二、安全审计类
3. 安全合规基线检查
#!/bin/bash
# 文件名:security_audit.sh
REPORT="security_audit_$(date +%s).txt"
echo"===== 用户安全检测 =====" > $REPORT
# 空密码检测
awk -F: '$2 == "" {print "空密码账户: " $1}' /etc/shadow >> $REPORT
# 超管账户检测
awk -F: '$3 == 0 && $1 != "root" {print "异常超管账户: " $1}' /etc/passwd >> $REPORT
echo -e "\n===== SSH安全检测 =====" >> $REPORT
grep "PermitRootLogin yes" /etc/ssh/sshd_config && echo"SSH允许root登录: 高风险!" >> $REPORT
echo -e "\n===== 防火墙状态 =====" >> $REPORT
systemctl is-active firewalld | grep -q active && firewall-cmd --list-all >> $REPORT || echo"防火墙未运行!" >> $REPORT
echo -e "\n===== 关键文件权限 =====" >> $REPORT
ls -l /etc/passwd /etc/shadow | awk '$1 !~ "-rw-r--r--" {print $9 " 权限异常: " $1}' >> $REPORT
用法:需root权限执行,输出当前安全风险项
4. 可疑进程扫描脚本
#!/bin/bash
# 文件名:suspicious_process_scan.sh
# 检测隐藏进程
echo"隐藏进程检测:"
ps -ef | awk 'NR>1 {print $2}' | sort -n | diff <(ls /proc | grep '^[0-9]' | sort -n) - | grep '>' | awk '{print "可疑PID: "$2}'
# 检测挖矿进程
echo -e "\n挖矿特征检测:"
ps aux | awk '{
if ($3 > 50.0 || $4 > 30.0)
print "高资源进程: " $11 " (CPU: "$3"%, MEM:"$4"%)"
if (match($0, /(xmrig|minerd|cpuminer)/))
print "挖矿进程: " $11 " PID: " $2
}'
用法:定期执行排查入侵痕迹
三、容器化环境专用
5. Docker容器健康扫描
#!/bin/bash
# 文件名:docker_health_check.sh
echo"===== 容器状态概览 ====="
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo -e "\n===== 异常容器检测 ====="
docker ps -a | grep -v Up | grep -v "Exited (0)" | awk 'NR>1 {print $1 " 状态异常: " $5}'
echo -e "\n===== 资源消耗TOP5 ====="
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" | sort -k2 -hr | head -6
用法:需安装Docker,实时输出容器健康状态
6. Kubernetes节点巡检
#!/bin/bash
# 文件名:k8s_node_check.sh
NODE=$(kubectl get nodes -o name | head -1)
echo"===== 节点资源 ====="
kubectl describe $NODE | grep -A5 Capacity
echo -e "\n===== 异常Pod检测 ====="
kubectl get pods -A | grep -v Running | grep -v Completed
echo -e "\n===== 服务端口检测 ====="
netstat -tuln | grep -E ":(80|443|6443)"
用法:需配置kubectl权限,检查K8s节点状态
四、存储与网络专项
7. LVM存储健康检查
#!/bin/bash
# 文件名:lvm_health_check.sh
echo"===== VG空间使用率 ====="
vgs --units g -o vg_name,vg_size,vg_free | awk 'NR>1 {printf "%s 可用空间: %.1fG\n", $1, $3}'
echo -e "\n===== 物理卷错误检测 ====="
pvs | grep -v 'Attributes' | awk '$2 != "lvm2" {print $1 " 状态异常: " $2}'
echo -e "\n===== 精简池容量告警 ====="
lvs -o lv_name,data_percent,metadata_percent --separator="|" | grep thinpool | awk -F\| '$2 > 80 || $3 > 80 {print $1 " 使用率超过80%!"}'
用法:检测LVM卷组、精简池风险
8. 网络连通性矩阵测试
#!/bin/bash
# 文件名:network_matrix_test.sh
TARGETS=("google.com 80""内部数据库IP 3306""存储节点IP 22")
TIMEOUT=2
for target in"${TARGETS[@]}"; do
host=${target% *}
port=${target#* }
(timeout$TIMEOUT bash -c ">/dev/tcp/$host/$port") &>/dev/null
result=$?
[ $result -eq 0 ] && status="成功" || status="失败"
echo"连通性: $status -> $host:$port"
done
echo -e "\n路由跟踪检测:"
mtr -n -c 3 --report google.com
用法:自定义TARGETS数组检测关键路径
五、日志与审计类
9. 日志关键错误提取
#!/bin/bash
# 文件名:critical_log_scan.sh
LOG_DIRS=("/var/log""/opt/app/logs")
ERROR_KEYWORDS=("error""fatal""exception""timeout")
fordirin"${LOG_DIRS[@]}"; do
find $dir -type f -mtime -1 | whileread logfile; do
for keyword in"${ERROR_KEYWORDS[@]}"; do
grep -i "$keyword""$logfile" | awk -v file="$logfile"'{print file ": " $0}'
done
done
done
用法:扫描24小时内含关键错误的日志行
10. 用户操作审计报告
#!/bin/bash
# 文件名:user_audit_report.sh
USERS=("root""admin")
DAYS=7
for user in"${USERS[@]}"; do
echo"===== $user 最近${DAYS}天操作 ====="
last | grep "$user" | head -10
echo -e "\n** 命令历史摘要 **"
grep -H "$user" /home/*/.bash_history | awk -F: '{print $1}' | sort | uniq -c | sort -nr
done
用法:监控特权账户操作行为
六、高级诊断工具
11. 性能瓶颈定位脚本
#!/bin/bash
# 文件名:performance_bottleneck.sh
echo"===== 系统负载 ====="
uptime
echo -e "\n===== 上下文切换分析 ====="
vmstat 2 5 | awk 'NR>=3 {print "上下文切换: " $12 " | 中断: " $11}'
echo -e "\n===== 块设备延迟 ====="
iostat -xmd 2 3 | awk '/sd[a-z]/ {if ($10 > 50) print $1 " 平均等待: " $10 "ms → 磁盘过载!"}'
echo -e "\n===== TCP重传检测 ====="
netstat -s | grep -E 'segments retransmited|packet receive errors'
用法:定位CPU/IO/网络层瓶颈
12. 内存泄漏追踪脚本
#!/bin/bash
# 文件名:memory_leak_hunter.sh
PID=$1# 传入进程PID
if [ -z "$PID" ]; then
echo"用法: $0 <进程PID>"
exit 1
fi
echo"监控进程: $(ps -p $PID -o comm=)"
echo"采样间隔10秒,持续5次"
for i in {1..5}; do
rss=$(ps -p $PID -o rss=)
echo"$(date +%T) RSS内存: ${rss}KB"
pmap $PID | tail -1 | awk '/total/ {print "地址空间: " $2}'
sleep 10
done
用法:./memory_leak_hunter.sh 1234
监控指定进程
七、自动化巡检框架
13. 多节点批量巡检框架
#!/bin/bash
# 文件名:multi_node_check.sh
NODES=("node1""192.168.1.101""app-server")
SCRIPT_PATH="/opt/scripts/full_system_check.sh"
for node in"${NODES[@]}"; do
echo"===== 巡检 $node ====="
ssh "$node""bash -s" < $SCRIPT_PATH
scp "$node:/var/log/full_system_*.log" ./logs/
echo"报告已保存到 ./logs/"
done
用法:提前配置SSH免密登录,批量执行基础巡检
14. 带告警的定时巡检
#!/bin/bash
# 文件名:scheduled_check_with_alert.sh
ALERT_EMAIL="admin@example.com"
LOG="/var/log/scheduled_check.log"
# 执行检查项
df -h | awk '$5 > 90' > $LOG
free -m | awk 'NR==2 && $3*100/$2 > 90' >> $LOG
# 触发告警
if [ -s $LOG ]; then
mail -s "服务器资源告警 $(hostname)"$ALERT_EMAIL < $LOG
echo"$(date) 告警已发送" >> $LOG
fi
用法:配置cron定时运行,超阈值自动发邮件
八、专项场景检测
15. Web服务可用性检测
#!/bin/bash
# 文件名:web_service_check.sh
URLS=("https://example.com""http://api.example.com/health")
TIMEOUT=10
for url in"${URLS[@]}"; do
status=$(curl -o /dev/null -s -w "%{http_code}" --connect-timeout $TIMEOUT$url)
if [ "$status" -ne 200 ]; then
echo"服务异常: $url 状态码: $status"
# 自动重启示例
systemctl restart nginx
fi
done
用法:监控Web服务状态,异常自动恢复
16. 数据库连接池检测
#!/bin/bash
# 文件名:db_connection_check.sh
DB_HOST="192.168.1.100"
DB_PORT=3306
MAX_CONN=200
current_conn=$(mysql -u monitor -p"密码" -h $DB_HOST -e "SHOW STATUS LIKE 'Threads_connected'" | awk 'NR==2 {print $2}')
echo"当前连接数: $current_conn"
if [ "$current_conn" -ge $MAX_CONN ]; then
echo"警告!连接数超过阈值 $MAX_CONN"
# 自动扩展连接池
ansible-playbook scale_db_pool.yml
fi
用法:MySQL连接池监控与自动扩容
九、安全加固类
17. 漏洞扫描自动化
#!/bin/bash
# 文件名:vulnerability_scan.sh
echo"===== 内核漏洞检测 ====="
rpm -q --changelog kernel | grep CVE
echo -e "\n===== SSL协议检测 ====="
openssl s_client -connect example.com:443 < /dev/null 2>&1 | grep "Protocol"
echo -e "\n===== 提权漏洞扫描 ====="
find / -perm -4000 -type f 2>/dev/null | xargs ls -l | awk '$3=="root" {print $9}'
用法:快速检测常见安全漏洞
18. 文件完整性校验
#!/bin/bash
# 文件名:file_integrity_check.sh
BASE_DIR="/etc"
CHECKSUM_FILE="/opt/security/.etc_checksums"
# 生成新校验和
find $BASE_DIR -type f -execsha256sum {} + > /tmp/new_checksums
# 对比差异
if [ -f "$CHECKSUM_FILE" ]; then
diff $CHECKSUM_FILE /tmp/new_checksums | grep '^>' | awk '{print "文件被修改: " $3}'
fi
# 更新基准
mv /tmp/new_checksums $CHECKSUM_FILE
用法:监控/etc目录文件篡改
十、容器专项
19. Docker漏洞扫描
#!/bin/bash
# 文件名:docker_vuln_scan.sh
echo"===== 基础镜像漏洞扫描 ====="
for image in $(docker images -q); do
echo"扫描镜像: $(docker inspect $image | grep RepoTag)"
docker scout cves $image
done
echo -e "\n===== 容器特权模式检测 ====="
docker ps --format "{{.Names}}" | whileread ctr; do
docker inspect $ctr | grep -q "Privileged.*true" && echo"$ctr 运行在特权模式!"
done
用法:检测镜像漏洞和危险配置
20. Kubernetes资源合规检查
#!/bin/bash
# 文件名:k8s_compliance_check.sh
echo"===== 未设资源限制的Pod ====="
kubectl get pods -A -o json | jq -r '.items[] | select(.spec.containers[].resources.limits == null) | .metadata.namespace + "/" + .metadata.name'
echo -e "\n===== 特权容器检测 ====="
kubectl get pods -A -o json | jq -r '.items[] | select(.spec.containers[].securityContext.privileged == true) | .metadata.namespace + "/" + .metadata.name'
echo -e "\n===== ConfigMap敏感数据检测 ====="
kubectl get configmaps -A -o json | jq -r '.items[] | select(.data != null) | .metadata.namespace + "/" + .metadata.name + ": " + (.data | keys[] | select(. | test("pass|secret|key")))'
用法:需安装jq,检查K8s资源合规性
脚本使用高级技巧
1. 定时任务配置
# 每天凌晨2点执行全量巡检
0 2 * * * /opt/scripts/full_system_check.sh
# 每5分钟检查服务状态
*/5 * * * * /opt/scripts/web_service_check.sh
2. 结果可视化方案
# 生成HTML报告
full_system_check.sh | ansi2html > report.html
# 使用ELK集中分析
curl -XPOST 'http://elk:9200/server/logs' -d @system_check.json
3. 企业级巡检架构
+----------------+ +-----------------+ +---------------+
| 节点执行脚本 | --> | 报告汇总服务器 | --> | 告警平台 |
+----------------+ +-----------------+ +---------------+
^ |
| v
[cron定时触发] [Grafana可视化面板]
最后总结:20大脚本适用场景速查
脚本类型 | 推荐脚本编号 | 核心功能 | 巡检频率 |
最佳实践:生产环境推荐采用“基础监控脚本(1/2)+安全脚本(3)+服务脚本(15)”组合,每日全量执行+关键指标实时监控。
评论 (0)