时尚

shell脚本使用snmp访问

时间:2010-12-5 17:23:32  作者:综合   来源:娱乐  查看:  评论:0
内容摘要: shell脚本使用snmp访问 网络设备不开口说话,但snmp是它们的通用语言。我上周排查一台核心交换机流量异常,登录设备看计数器太慢,写了个二十行的shell脚本,用snmpwalk把端口流量拉下

shell脚本使用snmp访问

网络设备不开口说话,本使但snmp是本使它们的通用语言。我上周排查一台核心交换机流量异常,本使登录设备看计数器太慢,本使写了个二十行的本使shell脚本,用snmpwalk把端口流量拉下来,本使三秒钟定位到故障端口。本使这就是本使snmp在shell里的价值——把网络设备变成可编程的数据源。

先确认环境。本使Linux下装snmp工具链:yum install net-snmp-utils或者apt install snmp。本使装完就能用snmpget和snmpwalk。本使前者取单个OID值,本使后者遍历子树。本使跟设备通信要带community string,本使默认是本使public,生产环境多半改了。我习惯把community和IP写进变量,脚本复用方便。

COMMUNITY="cisco123" HOST="192.168.1.1" OID_SYS="1.3.6.1.2.1.1.1.0" snmpget -v2c -c $COMMUNITY $HOST $OID_SYS 

上面这行能拿到系统描述。但真正干活得靠snmpwalk。想监控接口流量,得知道接口索引。先遍历接口表:snmpwalk -v2c -c $COMMUNITY $HOST 1.3.6.1.2.1.2.2.1.2,返回的是接口名和索引的映射。输出格式是OID = 值,用awk切分就行。注意OID最后一位就是接口索引,这个数字在后续流量查询里要用。

流量监控的核心OID是ifHCInOctets(1.3.6.1.2.1.31.1.1.1.6)和ifHCOutOctets(1.3.6.1.2.1.31.1.1.1.10)。它们是64位计数器,单位是字节。取两次值做差,除以时间间隔,就是速率。shell里做减法没问题,但计数器有回绕风险——好在64位计数器在千兆网下要几百年才回绕,可以忽略。

写个完整的监控脚本。核心思路:第一次采样存值,sleep 5秒,第二次采样,计算差值。我实际跑过的版本长这样:

#!/bin/bash COMMUNITY="public" HOST="192.168.1.1" IF_INDEX="1" OID_IN="1.3.6.1.2.1.31.1.1.1.6.$IF_INDEX" OID_OUT="1.3.6.1.2.1.31.1.1.1.10.$IF_INDEX" get_counter() {  snmpget -v2c -c $COMMUNITY -Oqv $HOST $1 2>/dev/null } IN1=$(get_counter $OID_IN) OUT1=$(get_counter $OID_OUT) sleep 5 IN2=$(get_counter $OID_IN) OUT2=$(get_counter $OID_OUT) IN_RATE=$(( (IN2 - IN1) * 8 / 5 )) OUT_RATE=$(( (OUT2 - OUT1) * 8 / 5 )) echo "入口速率: ${ IN_RATE} bps" echo "出口速率: ${ OUT_RATE} bps" 

注意-Oqv参数,它让snmpget只返回纯数值,不带OID和类型前缀,省掉awk解析。这个细节能省不少事。算速率时乘8是字节转比特,除以5是时间间隔。要是间隔设60秒,除以60就行。

踩过的坑得说。有些老设备不支持64位计数器,返回的ifInOctets(1.3.6.1.2.1.2.2.1.10)是32位,流量稍大就回绕。判断办法是看snmpget返回值的类型,如果显示Counter32,就得自己处理回绕逻辑——检测当前值小于上次值,就用最大值减去上次值加上当前值。麻烦,但比买商业监控软件便宜。

还有超时问题。snmp默认超时1秒,重试5次。设备CPU忙时可能响应慢,脚本就卡住了。我习惯加-t 3 -r 0参数,超时设3秒不重试。反正脚本里本来就有循环,失败就跳过这次采样,别让单次故障拖垮整个监控任务。

脚本写完后,丢进crontab做定时采集。每5分钟跑一次,输出追加到日志文件。再用awk从日志里提取峰值,配合sendmail发告警。全套下来不到一百行,比部署一套zabbix轻量多了。当然,要监控几十台设备还是得上正规系统,但临时排查、小规模监控,shell加snmp足够锋利。

最后提醒一点:snmp community是明文传输,别在不可信网络上用。真要跨公网采集,加个VPN隧道或者用snmpv3的加密认证。安全这根弦,什么时候都不能松。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap