使用Python的SNMP SET请求

时间:2019-02-11 14:39:05

标签: python snmp pysnmp

我需要使用python 3.7通过SNMP控制一个简单的设备,只是使其“打开”(1)和“关闭”(0)。在设备手册中的MIB信息中,每个命令都有一个OID列表(例如:GET输出状态:1.3.6 ........)。

我设法让GET请求按我的喜好工作(来源:http://snmplabs.com/pysnmp/examples/hlapi/asyncore/sync/manager/cmdgen/snmp-versions.html):

from pysnmp.hlapi import *

    g = getCmd(SnmpEngine()
              , CommunityData('public', mpModel=1)
              , hlapi.UdpTransportTarget(('DEVICE IP', 161))
              , ContextData()
              , ObjectType(ObjectIdentity('GET OID given by the device manual')))

    errorIndication, errorStatus, errorIndex, varBinds = next(g)

    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

但是,当我尝试以相同的方式使用SET时:(source:http://snmplabs.com/pysnmp/examples/hlapi/asyncore/sync/manager/cmdgen/modifying-variables.html

from pysnmp.hlapi import *
g = setCmd(SnmpEngine()
           , CommunityData('public', mpModel=1)
           , hlapi.UdpTransportTarget(('DEVICE IP', 161))
           , ContextData()
           , ObjectType(ObjectIdentity('SET OID given by the device manual, which is the same as the GET'), '1') #1 = new value
           )

errorIndication, errorStatus, errorIndex, varBinds = next(g)

print(errorIndication, varBinds)

我收到以下错误:

MibNotFoundError: SET OID compilation error(s): missingcaused by <class 'pysnmp.smi.error.MibNotFoundError'>: MIB file "SET OID.py[co]" not found in search path (DirMibSource('/home/username/anaconda3/lib/python3.7/site-packages/pysnmp/smi/mibs'), DirMibSource('/home/username/anaconda3/lib/python3.7/site-packages/pysnmp/smi/mibs/instances'), DirMibSource('pysnmp_mibs'), DirMibSource('/home/username/.pysnmp/mibs'))

我不明白为什么它在一种情况下没有问题而在另一种情况下没有问题。在设备手册中,说明与GET相同,但末尾有STRING 0或1,我想我在这里遗漏了一些东西,但找不到如何写。

如果有人有简单的答案或替代方法,我只想给这个非常简单的说明。

非常感谢您

P.S。 :我还尝试了本教程(https://www.ictshore.com/sdn/python-snmp-tutorial/),使其具有自己的功能,并且GET可以但不能SET。我知道我的OID不是对象类型。

1 个答案:

答案 0 :(得分:0)

当您将值传递给setCMD()时(显然)它必须是pysnmp.hlapi对象类型。例如:

from pysnmp.hlapi import *
engine = SnmpEngine()
community = CommunityData('public', mpModel=1)
transport = UdpTransportTarget(('192.168.1.1', 161))
context = ContextData()

# Your OID goes here.
identity = ObjectIdentity('1.3.6.1.4.1.534.6.6.7.6.1.1.3.0')

# If this was a string value, use OctetString() instead of Integer().
new_value = Integer(1)
type = ObjectType(identity, new_value)

# Setting lookupMib=False here because this example uses a numeric OID.
g = setCmd(engine, community, transport, context, identity, type, lookupMib=False)

errorIndication, errorStatus, errorIndex, varBinds = next(g)
print(errorIndication, varBinds)

我可能错过了如何使用pysnmp.hlapi的精妙之处,但这是对我有用的咒语。