如何在Java中提取NET-SNMP的snmpwalk、snmpgetnext及snmpget命令结果?
SNMP命令结果提取与结构化处理
一、snmpget/snmpgetnext单行结果提取
提取方法
直接使用snmp命令自带的输出格式化参数-Oqv,可以跳过OID和类型信息,直接输出实际结果(包括正常数值或错误提示)。
示例:
正常结果场景:
snmpget -v 2c -c public 192.168.1.1 -Oqv SNMPv2-SMI::enterprises.232.6.2.17.2.1.5.0.1输出:
1实例不存在场景:
snmpget -v 2c -c public 192.168.1.1 -Oqv SNMPv2-SMI::enterprises.232.6.2.17.2.1.5.0输出:
No Such Instance currently exists at this OID
为什么不推荐正则表达式实现
- 输出格式兼容性差:不同SNMP版本、不同厂商设备的输出格式可能存在差异(比如类型字段的空格、大小写变化),正则表达式容易因格式变动失效。
- 错误场景覆盖不全:SNMP的错误提示不止"No Such Instance",还有"No Such Object"、请求超时等多种情况,正则要覆盖所有场景需要复杂的规则,容易遗漏。
- 维护成本高:如果snmp工具更新了输出格式,正则表达式必须同步修改;而使用官方自带的格式化参数是原生支持的,兼容性和稳定性更有保障。
二、snmpwalk生成<OID, 结果>映射结构
利用snmpwalk的输出参数结合简单的文本处理工具,就能生成键值对结构。
实现步骤
- 使用
-On参数强制输出数字格式的OID,-Oqv参数交替输出OID和对应的值; - 用
awk将相邻的OID和值配对,整理成<OID,结果>格式。
示例命令:
snmpwalk -v 2c -c testro 172.0.0.1 -On -Oqv .1.3.6.1.4.1.2352.2.4.1.4.1.3 | awk 'NR%2{oid=$0;next}{print "<" oid "," $0 ">"}'
输出结果:
<1.3.6.1.4.1.2352.2.4.1.4.1.3.18.1,36> <1.3.6.1.4.1.2352.2.4.1.4.1.3.31.1,35> <1.3.6.1.4.1.2352.2.4.1.4.1.3.36.1,35>
这种方法同样依赖snmp工具的原生格式化能力,避免了正则表达式的各种兼容性问题,输出结果稳定易维护。
内容的提问来源于stack exchange,提问作者flower
相关产品推荐
相关产品推荐

