如何为我的专有MIB

时间:2017-02-22 17:50:53

标签: python snmp pysnmp

我终于设法使用以下python脚本为我的专有MIB生成一个Get命令:

from pysnmp.entity.rfc3413.oneliner import cmdgen

errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().getCmd(
        cmdgen.CommunityData('10.0.1.134', 'admin', 0),
        cmdgen.UdpTransportTarget(('10.0.1.134', 161)),
        (1,3,6,1,4,1,4515,1,8,1,1,1,8,1295360,1295360)
 )

print (varBinds)

print (varBinds[0])

print (varBinds[0][0])

print (varBinds[0][1])

varBinds以4种不同的方式打印仅适用于学习过程。 现在我尝试模仿相同的脚本,同时将其转换为Set Command(没有任何成功)。有很多例子可以得到但不适合。所以,我尝试了以下内容:

from pysnmp.entity.rfc3413.oneliner import cmdgen

errorIndication, errorStatus, errorIndex, rspVarBinds = cmdgen.CommandGenerator().setCmd(
        cmdgen.CommunityData('10.0.1.134', 'admin', 0),
        cmdgen.UdpTransportTarget(('10.0.1.134', 161)),
        (1,3,6,1,4,1,4515,1,8,1,1,1,8,1295360,1295360),
        (1),
 )

我没有成功地生成Set Command,如您所见。而且我也不知道如何才能让它发挥作用。顺便说一句,我设置的OID是一个读写,整数(32位),具有以下可能的值:up(1),down(2)和standby(3)。

为了成功设置具有任何可能值的OID,我需要更改什么?

我已尝试过您建议的脚本但失败了:

from pysnmp.hlapi import SnmpEngine, setCmd, CommunityData, UdpTransportTarget, ContextData, ObjectType, ObjectIdentity

from pysnmp.proto.api.v2c import Integer32
setCmd(SnmpEngine(),
       CommunityData('public', mpModel=0),
       UdpTransportTarget('10.0.1.134', 161),
       ContextData(),
       ObjectType(ObjectIdentity('1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360'), Integer32(1)))

这是我收到的错误消息:

**追踪(最近一次通话): 文件" C:\ Program Files \ Python35 \ lib \ site-packages \ pysnmp-4.3.2-py3.5.egg \ pysnmp \ hlapi \ asyncore \ transport.py",第56行,在_resolveAddr socket中.IPPROTO_UDP)[0] [4] [2] 文件" C:\ Program Files \ Python35 \ lib \ socket.py",第732行,在getaddrinfo中为_socket.getaddrinfo中的res(host,port,family,type,proto,flags):socket.gaierror :[Errno 11004] getaddrinfo失败

在处理上述异常期间,发生了另一个异常:

追踪(最近一次通话): 文件"",第3行,in 文件" C:\ Program Files \ Python35 \ lib \ site-packages \ pysnmp-4.3.2-py3.5.egg \ pysnmp \ hlapi \ transport.py",第17行,在 init中 self.transportAddr = self._resolveAddr(transportAddr) 文件" C:\ Program Files \ Python35 \ lib \ site-packages \ pysnmp-4.3.2-py3.5.egg \ pysnmp \ hlapi \ asyncore \ transport.py",第58行,在_resolveAddr中error.PySnmpError(' Bad IPv4 / UDP传输地址错误%s:%s'%(' @' .join([str(x)for transportAddr中的x]),sys。 exc_info()[1]))pysnmp.error.PySnmpError:错误的IPv4 / UDP传输地址1 @ 0 @。@ 0 @。@ 1 @。@ 1 @ 3 @ 4:[Errno 11004] getaddrinfo失败**

为了解决这个问题,我需要做些什么?

1 个答案:

答案 0 :(得分:1)

您必须将OID值对包装到ObjectType个对象中:

setCmd(SnmpEngine(),
       CommunityData('public', mpModel=0),
       UdpTransportTarget(('demo.snmplabs.com', 161)),
       ContextData(),
       ObjectType(ObjectIdentity('1.3.6.1.2.1.1.9.0'), Integer32(1)))

上面的代码并不真正使用任何MIB。如果您希望以更友好的条件操作,可以使用MIB模块+符号替换OID,使用标签替换整数(如MIB中所述):

setCmd(SnmpEngine(),
       CommunityData('public', mpModel=0),
       UdpTransportTarget(('demo.snmplabs.com', 161)),
       ContextData(),
       ObjectType(ObjectIdentity('MY-CUSTOM-MIB', 'myCustomVariable', 0), 'up'))

这是working example