我想通过使用python pysnmp模块获取snmp数据。我使用命令行来获取SNMP数据,但现在我想使用pysnmp模块读取它。
SNMP命令 -
snmpwalk -v 1 -c public <ip address>:<port> xyz::pqr
我正在使用上面的命令。现在我尝试了类似下面的内容 -
import netsnmp
def getmac():
oid = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.2.1.17.7.1.2.2.1.2'))
res = netsnmp.snmpgetbulk(oid, Version = 1, DestHost='ip',
Community='pub')
return res
print getmac()
我正面临错误 - 导入netsnmp。没有模块netsnmp
任何人都可以给我建议如何使用python从snmp服务器获取snmp数据?
答案 0 :(得分:3)
您好像使用netsnmp
模块而不是pysnmp
。
如果您想使用pysnmp
,那么this example可能有所帮助:
from pysnmp.hlapi import *
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData(),
ObjectType(ObjectIdentity('1.3.6.1.2.1.17.7.1.2.2.1.2'))):
if errorIndication or errorStatus:
print(errorIndication or errorStatus)
break
else:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
更新:
上面的循环将每次迭代获取一个OID值。如果您想更有效地获取数据,一个选项是将更多OID填充到查询中(以许多ObjectType(...)
参数的形式)。
或者您可以切换到GETBULK PDU类型,这可以通过将nextCmd
来电更改为bulkCmd
like this来完成。
from pysnmp.hlapi import *
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in bulkCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('demo.snmplabs.com', 161)),
ContextData(),
0, 25, # fetch up to 25 OIDs one-shot
ObjectType(ObjectIdentity('1.3.6.1.2.1.17.7.1.2.2.1.2'))):
if errorIndication or errorStatus:
print(errorIndication or errorStatus)
break
else:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
请记住,GETBULK命令支持最初是在SNMP v2c中引入的,即您无法通过SNMP v1使用它。