Python Netsnmp和snmpwalk

时间:2018-12-03 23:01:58

标签: python linux snmp net-snmp

我正在尝试使用snmpwalk在某些界面上获取一些信息和统计信息。我用这个:

import netsnmp

serv = "172.16.1.1"
snmp_pass = "private"

oid = netsnmp.VarList('IF-MIB::ifName','IF-MIB::ifDescr')
snmp_res = netsnmp.snmpwalk(oid, Version=2, DestHost=serv, Community=snmp_pass)
for x in snmp_res:
    print "snmp_res:: ", x

我得到的答案是:

snmp_res:: lo
snmp_res:: EtherNet Adapter XYZ

答案是正确的,但我需要更多信息。当我使用snmpwalk从linux命令执行相同的操作时,我会获得更多信息,例如:

IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: EtherNet Adapter XYZ

“ EtherNet适配器XYZ”的ID为2,我也需要该值来引用接口上的其他统计信息。如何使用python和snmp来获取该信息?

1 个答案:

答案 0 :(得分:1)

直接从the documentation中退出:

  

snmpwalk(<Varbind/VarList>, <Session args>))

     

在netsnmp.Session的args之前加上Varbind或                  VarList,将从其开始“行走”操作。                  返回从下面的MIB检索的值的元组                  Varbind传入。如果传入了VarList                  将被更新以包含完整的VarBinds集                  为步行的结果而创建。不是                  建议您松散地传递Varbind                  检查返回的OID的能力。但是,如果只有                  传递了Varbind将会原封不动地返回。

     

请注意,仅一个varbind应该包含在                  传入了VarList。代码的结构可能是                  处理这就是未来,但是现在走                  一次不支持多棵树,并且将                  产生不足的结果。

您已经传递了 VarList ,因此您已经拥有了所需的内容。您只需要正确检查结果即可。

The tests举例:

vars = netsnmp.VarList(netsnmp.Varbind('system'))

vals = sess.walk(vars)
print "v1 sess.walk result: ", vals, "\n"

for var in vars:
    print "  ",var.tag, var.iid, "=", var.val, '(',var.type,')'

关键是修改了 input 变量以提供所需的内容。返回值对您来说没有太大价值。

将所有内容放在一起看起来就像您需要以下内容:

import netsnmp

serv = "172.16.1.1"
snmp_pass = "private"

oid = netsnmp.VarList('IF-MIB::ifName','IF-MIB::ifDescr')
snmp_res = netsnmp.snmpwalk(oid, Version=2, DestHost=serv, Community=snmp_pass)
for x in oid:
    print "snmp_res:: ", x.iid, " = ", x.val

(免责声明:无法测试;根据需要进行调整)

该文档中有有关 VarBind VarList 的足够信息,可以找出从x中脱颖而出的最佳方法。

但是,

x.iid是实例标识符,因此应该为您提供您所追求的12。不过,请不要忘记检查x.tag,它们将是IF-MIB::ifNameIF-MIB::ifDescr(或类似的东西;您必须进行实验)。