如何使用pysnmp获取SNMP数据?

问题描述 投票:0回答:1

我想使用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 数据?

python snmp net-snmp pysnmp
1个回答
5
投票

您似乎使用的是

netsnmp
模块,而不是
pysnmp

如果您想使用

pysnmp
,那么这个示例可能会有所帮助:

from pysnmp.hlapi import *

for (errorIndication,
     errorStatus,
     errorIndex,
     varBinds) in nextCmd(SnmpEngine(),
                          CommunityData('public', mpModel=0),
                          UdpTransportTarget(('demo.pysnmp.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
像这样来完成。

from pysnmp.hlapi import *

for (errorIndication,
     errorStatus,
     errorIndex,
     varBinds) in bulkCmd(SnmpEngine(),
        CommunityData('public'),
        UdpTransportTarget(('demo.pysnmp.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 使用它。

© www.soinside.com 2019 - 2024. All rights reserved.