别再只会用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 public2. 智能流量阈值告警机制
网络拥塞往往源于突发的流量激增。以下脚本监控特定端口的流量并触发阈值告警:
#!/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 1003. 网络设备资产自动发现系统
当管理大量网络设备时,保持准确的资产清单至关重要。以下脚本自动发现并记录网络设备关键信息:
#!/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 public4. 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 105. 配置变更审计与告警系统
网络设备的配置变更需要严格审计。以下脚本通过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实现进行适当调整。建议先在测试环境验证各脚本功能,再逐步部署到生产环境。定期检查脚本日志,确保监控系统本身正常运行。
