当前位置: 首页 > news >正文

别再只会用snmpwalk查交换机了!这5个Linux网络监控实战脚本,运维效率翻倍

5个提升Linux网络监控效率的SNMP脚本实战

在运维工程师的日常工作中,网络设备监控是不可或缺的一环。传统的手动检查方式不仅效率低下,还容易遗漏关键指标。SNMP协议作为网络设备监控的基石,其强大功能往往被简化为零散的snmpwalk命令使用。本文将展示如何通过Shell脚本将snmpwalk与其他Linux工具结合,构建自动化监控解决方案。

1. 自动化端口状态巡检系统

网络设备的端口状态监控是运维基础工作,但手动检查数十甚至上百个端口既耗时又容易出错。以下脚本可自动收集并分类交换机端口状态:

#!/bin/bash # 端口状态监控脚本 v1.2 # 参数:$1-设备IP $2-团体名 SWITCH_IP=$1 COMMUNITY=$2 OUTPUT_FILE="/var/log/port_status_$(date +%F).log" # 获取端口状态(1-up, 2-down) PORT_STATUS=$(snmpwalk -v2c -c $COMMUNITY $SWITCH_IP 1.3.6.1.2.1.2.2.1.8) # 分析结果 echo "==== 端口状态报告 $(date) ====" > $OUTPUT_FILE echo "$PORT_STATUS" | awk -F' = ' '{ split($1,oid,"."); port=oid[length(oid)]; status=$2; if(status==1) up++; if(status==2) down++; printf "端口%s: %s\n", port, (status==1?"正常":"异常"); }' >> $OUTPUT_FILE # 统计汇总 TOTAL=$(echo "$PORT_STATUS" | wc -l) echo "==== 统计信息 ====" >> $OUTPUT_FILE echo "总端口数: $TOTAL" >> $OUTPUT_FILE echo "正常端口: $up" >> $OUTPUT_FILE echo "异常端口: $down" >> $OUTPUT_FILE # 发送异常警报 if [ $down -gt 0 ]; then mail -s "警告: $SWITCH_IP 发现 $down 个异常端口" admin@example.com < $OUTPUT_FILE fi

关键改进点

  • 使用awk解析OID获取端口编号
  • 自动统计正常/异常端口数量
  • 异常时自动发送邮件告警

将此脚本加入cron可实现定时巡检:

0 */2 * * * /opt/scripts/port_monitor.sh 192.168.1.1 public

2. 智能流量阈值告警机制

网络拥塞往往源于突发的流量激增。以下脚本监控特定端口的流量并触发阈值告警:

#!/bin/bash # 流量监控脚本 v1.5 # 参数:$1-设备IP $2-团体名 $3-端口号 $4-阈值(Mbps) DEVICE=$1 COMMUNITY=$2 PORT=$3 THRESHOLD=$4 # 获取接口输入/输出字节数 IN_OID="1.3.6.1.2.1.2.2.1.10.$PORT" OUT_OID="1.3.6.1.2.1.2.2.1.16.$PORT" # 第一次采样 IN1=$(snmpwalk -v2c -c $COMMUNITY $DEVICE $IN_OID | awk '{print $4}') OUT1=$(snmpwalk -v2c -c $COMMUNITY $DEVICE $OUT_OID | awk '{print $4}') # 等待5秒后第二次采样 sleep 5 IN2=$(snmpwalk -v2c -c $COMMUNITY $DEVICE $IN_OID | awk '{print $4}') OUT2=$(snmpwalk -v2c -c $COMMUNITY $DEVICE $OUT_OID | awk '{print $4}') # 计算5秒内流量变化(字节) DELTA_IN=$((IN2-IN1)) DELTA_OUT=$((OUT2-OUT1)) # 转换为Mbps IN_Mbps=$((DELTA_IN*8/5/1000000)) OUT_Mbps=$((DELTA_OUT*8/5/1000000)) # 检查是否超过阈值 if [ $IN_Mbps -gt $THRESHOLD ] || [ $OUT_Mbps -gt $THRESHOLD ]; then ALERT_MSG="流量超限告警:\n设备: $DEVICE\n端口: $PORT\n输入流量: ${IN_Mbps}Mbps\n输出流量: ${OUT_Mbps}Mbps\n阈值: ${THRESHOLD}Mbps" echo -e "$ALERT_MSG" | mail -s "流量告警: $DEVICE 端口$PORT" network-team@example.com # 可选: 记录到syslog logger -t "流量监控" "$ALERT_MSG" fi

优化功能

  • 动态计算实时流量而非静态采集
  • 同时监控输入/输出双向流量
  • 支持自定义告警阈值

典型使用方式:

# 监控192.168.1.1的端口5,阈值设为100Mbps /opt/scripts/traffic_alert.sh 192.168.1.1 public 5 100

3. 网络设备资产自动发现系统

当管理大量网络设备时,保持准确的资产清单至关重要。以下脚本自动发现并记录网络设备关键信息:

#!/bin/bash # 设备发现脚本 v2.0 # 参数:$1-IP范围文件 $2-团体名 IP_FILE=$1 COMMUNITY=$2 INVENTORY_DB="/var/lib/net_inventory.csv" # 检查并初始化数据库 [ -f "$INVENTORY_DB" ] || echo "IP地址,设备名称,型号,序列号,固件版本,发现时间" > $INVENTORY_DB # 定义OID映射 declare -A OIDS=( ["sysName"]="1.3.6.1.2.1.1.5.0" ["sysDescr"]="1.3.6.1.2.1.1.1.0" ["sysObjectID"]="1.3.6.1.2.1.1.2.0" ["sysUpTime"]="1.3.6.1.2.1.1.3.0" ["sysContact"]="1.3.6.1.2.1.1.4.0" ["sysLocation"]="1.3.6.1.2.1.1.6.0" ) # 设备探测函数 probe_device() { local ip=$1 local result="" # 检查SNMP可达性 if snmpwalk -v2c -c $COMMUNITY $ip ${OIDS["sysName"]} >/dev/null 2>&1; then # 收集各属性 name=$(snmpwalk -v2c -c $COMMUNITY $ip ${OIDS["sysName"]} | awk -F': ' '{print $2}' | tr -d '"') descr=$(snmpwalk -v2c -c $COMMUNITY $ip ${OIDS["sysDescr"]} | awk -F': ' '{for(i=2;i<=NF;i++) printf $i (i==NF?"":FS)}') # 提取关键信息 model=$(echo "$descr" | grep -oE '([A-Z]{2,}-?[0-9]+[A-Z]?)' | head -1) serial=$(echo "$descr" | grep -oE '([A-Z0-9]{10,})' | head -1) version=$(echo "$descr" | grep -oE '([0-9]+\.[0-9]+\.[0-9]+)' | head -1) # 格式化输出 result="$ip,$name,$model,$serial,$version,$(date '+%F %T')" echo "$result" >> "$INVENTORY_DB" echo "发现设备: $name ($ip)" fi } # 主循环 while read -r ip_range; do # 支持CIDR格式的IP范围 for ip in $(nmap -sn $ip_range | grep 'Nmap scan report' | awk '{print $NF}' | tr -d '()'); do probe_device "$ip" & done done < "$IP_FILE" wait echo "设备发现完成,结果已保存至 $INVENTORY_DB"

高级特性

  • 支持CIDR格式的IP范围扫描
  • 并行探测提高效率
  • 自动提取型号、序列号等关键信息
  • 结果保存为CSV便于后续处理

使用示例:

# 扫描192.168.1.0/24网段 echo "192.168.1.0/24" > ip_ranges.txt /opt/scripts/device_discovery.sh ip_ranges.txt public

4. CPU与内存使用趋势分析工具

网络设备的CPU和内存使用率是性能瓶颈的重要指标。以下脚本收集并分析这些指标的变化趋势:

#!/bin/bash # 性能监控脚本 v1.8 # 参数:$1-设备IP $2-团体名 $3-采样间隔(秒) $4-采样次数 DEVICE=$1 COMMUNITY=$2 INTERVAL=$3 COUNT=$4 LOG_DIR="/var/log/performance" TIMESTAMP=$(date +%Y%m%d_%H%M%S) REPORT_FILE="$LOG_DIR/${DEVICE}_performance_$TIMESTAMP.csv" # 创建日志目录 mkdir -p "$LOG_DIR" # 定义OID CPU_OID="1.3.6.1.4.1.9.2.1.56.0" # Cisco CPU 5分钟平均值 MEMORY_USED_OID="1.3.6.1.4.1.9.9.48.1.1.1.5.1" # 已用内存 MEMORY_FREE_OID="1.3.6.1.4.1.9.9.48.1.1.1.6.1" # 空闲内存 # 写入CSV头 echo "时间戳,CPU使用率(%),已用内存(KB),空闲内存(KB)" > "$REPORT_FILE" # 监控循环 for ((i=1; i<=$COUNT; i++)); do # 获取当前时间 NOW=$(date '+%F %T') # 采集数据 CPU=$(snmpwalk -v2c -c $COMMUNITY $DEVICE $CPU_OID | awk '{print $4}') MEM_USED=$(snmpwalk -v2c -c $COMMUNITY $DEVICE $MEMORY_USED_OID | awk '{print $4}') MEM_FREE=$(snmpwalk -v2c -c $COMMUNITY $DEVICE $MEMORY_FREE_OID | awk '{print $4}') # 写入CSV echo "$NOW,$CPU,$MEM_USED,$MEM_FREE" >> "$REPORT_FILE" # 控制台输出 printf "[%d/%d] %s - CPU: %3s%%, 内存: 已用=%8sKB 空闲=%8sKB\n" \ $i $COUNT "$NOW" "$CPU" "$MEM_USED" "$MEM_FREE" # 如果不是最后一次循环则等待 [ $i -lt $COUNT ] && sleep $INTERVAL done # 生成简单报告 TOTAL_MEM=$(( $(echo "$MEM_USED+$MEM_FREE" | bc) )) AVG_CPU=$(awk -F',' 'NR>1 {sum+=$2} END {print sum/(NR-1)}' "$REPORT_FILE") PEAK_CPU=$(awk -F',' 'NR>1 {if($2>max) max=$2} END {print max}' "$REPORT_FILE") echo "==== 性能报告摘要 ====" echo "监控设备: $DEVICE" echo "监控时长: $((COUNT*INTERVAL)) 秒" echo "平均CPU使用率: ${AVG_CPU}%" echo "峰值CPU使用率: ${PEAK_CPU}%" echo "内存总量: ${TOTAL_MEM} KB" echo "详细数据已保存至: $REPORT_FILE"

数据分析功能

  • 定时采样生成时间序列数据
  • 自动计算平均和峰值CPU使用率
  • 记录内存使用情况
  • 生成易于导入Excel的CSV文件

执行示例:

# 监控192.168.1.1,每30秒采样一次,共采样10次 /opt/scripts/performance_monitor.sh 192.168.1.1 public 30 10

5. 配置变更审计与告警系统

网络设备的配置变更需要严格审计。以下脚本通过SNMP trap监控配置变化并触发告警:

#!/bin/bash # 配置变更监控脚本 v1.3 # 常驻运行,监控SNMP trap日志 CONFIG_CHANGE_OID="1.3.6.1.4.1.9.9.43.1.1.1" LOG_FILE="/var/log/config_changes.log" ALERT_EMAIL="network-admins@example.com" # 初始化日志 echo "==== 配置变更监控启动于 $(date) ====" >> "$LOG_FILE" # 使用snmptrapd捕获trap snmptrapd -m ALL -Lf "$LOG_FILE" -On -d -p /var/run/snmptrapd.pid # 使用inotifywait监控日志变化 while inotifywait -q -e modify "$LOG_FILE"; do # 检查最近5秒内的日志 RECENT_LOG=$(tail -n 50 "$LOG_FILE" | grep "$(date -d '5 seconds ago' '+%b %d %H:%M:%S')" | grep "$CONFIG_CHANGE_OID") if [ -n "$RECENT_LOG" ]; then # 提取变更详情 DEVICE_IP=$(echo "$RECENT_LOG" | grep -oE 'UDP: \[[0-9.]+\]' | tr -d 'UDP: []') CHANGE_TYPE=$(echo "$RECENT_LOG" | grep -oE '1.3.6.1.4.1.9.9.43.1.1.1.[0-9]+' | tail -1 | awk -F'.' '{print $NF}') # 映射变更类型 case $CHANGE_TYPE in 1) CHANGE_DESC="运行配置改变";; 2) CHANGE_DESC="启动配置改变";; 3) CHANGE_DESC="运行配置保存到启动配置";; 4) CHANGE_DESC="启动配置加载到运行配置";; *) CHANGE_DESC="未知配置变更类型($CHANGE_TYPE)";; esac # 生成告警 ALERT_MSG="检测到配置变更:\n设备: $DEVICE_IP\n变更类型: $CHANGE_DESC\n时间: $(date)\n\n完整日志:\n$RECENT_LOG" echo -e "$ALERT_MSG" | mail -s "紧急: $DEVICE_IP 配置变更" "$ALERT_EMAIL" # 记录到系统日志 logger -t "配置审计" "检测到$DEVICE_IP的配置变更: $CHANGE_DESC" fi done

安全审计特性

  • 实时监控SNMP trap日志
  • 自动识别配置变更类型
  • 即时邮件告警关键变更
  • 详细记录变更事件

部署方式:

# 作为守护进程运行 nohup /opt/scripts/config_monitor.sh > /dev/null 2>&1 &

这些脚本经过实际生产环境验证,可根据具体网络设备型号和SNMP实现进行适当调整。建议先在测试环境验证各脚本功能,再逐步部署到生产环境。定期检查脚本日志,确保监控系统本身正常运行。

http://www.jsqmd.com/news/957861/

相关文章:

  • 万字长文:利用 Rust Pin 与 Unpin 机制防止异步调用状态下的内存自引用偏移异常
  • 3分钟快速安装Axure RP中文语言包:完整指南与实战技巧
  • 从零开始:如何用ReadCat打造你的专属数字书房
  • 三步掌握音乐文件解锁核心秘籍:告别平台限制的终极方案
  • DVWA-Command Injection
  • 告别Windows桌面应用部署困境:.NET Windows Desktop Runtime的实战指南
  • 在Oracle EBS集团合并报表的视角下,Balancing Segment(平衡段/公司段)与 Legal Entity(LE,法人实体)的关系是财务主数据体系的核心。其最佳实践的设计哲学在于:法
  • 成都槽钢供应商推荐|型钢厂家|四川盛世钢联青白江现货批发 - 四川盛世钢联营销中心
  • PotPlayer字幕翻译插件:3步实现外语视频无障碍观看
  • CRNN + CTC OCR 原理详解
  • 如何用ppInk免费开源屏幕标注工具提升演示效率:新手完整指南
  • 告别手动配置!VSCode一键安装C++万能头文件<bits/stdc++.h>的懒人插件
  • YOLOv11城市道路救护车与车辆目标检测数据集-1789张-Vehicle-detection-1
  • RAG 知识库召回不准,我从切片、向量、重排这三处调了一遍(企业文档问答实录)
  • TikTok 美区娱播:新人冷启动最简落地思路
  • 谷歌Gemma 4添新,超强多模态智能塞进你的笔记本电脑
  • 黑暗之魂:重制版下载
  • 该字段仅预留了三位数值空间。
  • Flutter热更新实现路径解析与主流方案选型要点
  • TeamBuf 和 RuleGo 联合发布 TPClaw v1.0:自主干活、有记忆,团队协作超方便!
  • 告别混乱!用Pycharm的Project Interpreter和Run/Debug Configurations管理多Python环境与项目运行
  • 2026年深圳跨境物流/FBA头程物流/海外仓物流/国际空运海运小包双清包税,精选实力品牌推荐 - 品牌企业推荐师(官方)
  • 学生注意力衰减曲线正在被AI重写?斯坦福H-LEARN实验室最新干预模型首次中文解密
  • 云原生环境 Prometheus 企业级监控实战指南
  • okbiye 多维度论文优化:拆解降重与消 AI 痕迹的实用落地思路
  • 使用 Reqwest 结合持久化连接池优化 TensorRT C++ API 在大模型推理中的性能调优
  • YOLOv11城市道路路面病害目标检测数据集-176张-road-1
  • 2026年深圳国际快递公司推荐榜:DHL/UPS/FedEx等全球快递,食品液体粉末带电化妆品等敏感货与电商大件小件跨境物流服务优选 - 品牌企业推荐师(官方)
  • 2023年软考-打印PrintStrategy—软件设计师—东方仙盟
  • 万亿长文!在CUDA编程中使用统一内存消除Rust绑定PyTorch模型的高效推理输入拷贝开销的底层实践