ket*_*tan 4 python snmp net-snmp pysnmp
我想通过使用 python pysnmp 模块获取 snmp 数据。我曾经使用命令行来获取 SNMP 数据,但现在我想使用 pysnmp 模块来读取它。
SNMP命令-
snmpwalk -v 1 -c public <ip address>:<port> xyz::pqr
Run Code Online (Sandbox Code Playgroud)
我正在使用像上面这样的命令。现在我尝试了类似下面的东西 -
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()
Run Code Online (Sandbox Code Playgroud)
我遇到错误 -导入 netsnmp。没有模块 netsnmp
任何人都可以给我建议如何使用 python 从 snmp 服务器获取 snmp 数据?
您似乎正在使用该netsnmp模块而不是pysnmp.
如果您想使用pysnmp,那么这个示例可能会有所帮助:
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]))
Run Code Online (Sandbox Code Playgroud)
更新:
上述循环每次迭代都会获取一个 OID 值。如果您想更有效地获取数据,一种选择是将更多 OID 填充到查询中(以许多ObjectType(...)参数的形式)。
nextCmd或者您可以切换到 GETBULK PDU 类型,这可以通过将您的呼叫更改为bulkCmd 这样来完成。
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]))
Run Code Online (Sandbox Code Playgroud)
请记住,GETBULK 命令支持首次在 SNMP v2c 中引入,也就是说您不能通过 SNMP v1 使用它。
| 归档时间: |
|
| 查看次数: |
18421 次 |
| 最近记录: |