我正在尝试使用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来获取该信息?
答案 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
是实例标识符,因此应该为您提供您所追求的1
和2
。不过,请不要忘记检查x.tag
,它们将是IF-MIB::ifName
或IF-MIB::ifDescr
(或类似的东西;您必须进行实验)。