20个高效Linux一键巡检脚本 运维工程师的自动化利器!

奥黛丽·逐爱者
2025-06-23 / 0 评论 / 0 阅读 / 正在检测是否收录...

 

在大型服务器集群管理中,自动化巡检脚本已成为运维工程师的核心工具。据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
CPU/内存/磁盘实时监控
5分钟~1小时
安全审计
3, 17, 18
合规检查/漏洞扫描
每日
容器环境
5, 6, 19, 20
容器/K8s健康检查
15分钟
存储专项
7
LVM/磁盘性能分析
每日
网络诊断
8, 15
连通性/服务可用性
1~5分钟
日志分析
9, 10
错误提取/操作审计
每小时
高级诊断
11, 12
性能瓶颈/内存泄漏
按需
自动化框架
13, 14
批量巡检/告警集成
定时任务

最佳实践:生产环境推荐采用“基础监控脚本(1/2)+安全脚本(3)+服务脚本(15)”组合,每日全量执行+关键指标实时监控。

 

以上,既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~谢谢你看我的文章,我们,下次再见

0

评论 (0)

取消