Python 如何为专有MIB生成Set命令

Python 如何为专有MIB生成Set命令,python,snmp,pysnmp,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.UdpTrans

我最终使用以下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命令(没有任何成功)。有很多例子,但不适合。因此,我尝试了以下方法:

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命令。我不知道我该如何让它工作。顺便说一下,我正在设置的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行,位于_resolveaddrsocket.IPPROTO_UDP)[0][4][:2] 文件“C:\Program Files\Python35\lib\socket.py”,第732行,位于getaddrinfo中,用于_socket.getaddrinfo中的res(主机、端口、系列、类型、协议、标志):socket.gaier:[Errno 11004]getaddrinfo失败

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

回溯(最近一次呼叫最后一次): 文件“”,第3行,在 文件“C:\Program Files\Python35\lib\site packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\transport.py”,第17行,在initself.transportAddr=self.\u解析器addr(transportAddr) 文件“C:\Program Files\Python35\lib\site packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\asyncore\transport.py”,第58行,在解析器raise error.PySnmpError('错误的IPv4/UDP传输地址%s:%s'('@'。连接([str(x)代表transportAddr中的x]),sys exc_info()[1])pysnmp.error.PySnmpError:错误的IPv4/UDP传输地址1@0@.@0@.@1@.@1@3@4: [Errno 11004]getaddrinfo失败**


要解决此问题,我需要做什么?

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

上面的代码实际上没有使用任何MIB。如果您想以更人性化的术语进行操作,可以使用MIB模块+符号替换OID,使用标签替换整数(如MIB中所述):


这里有一个。

我已经尝试了你建议的脚本,但仍然缺少一些内容。我编辑了上面的问题。我发现了错误,我缺少UDPTTransportTarget中的偏执。现在我可以运行我的脚本,没有任何错误。我的问题是Set命令实际上没有完成(我通过MIB浏览器执行Get commanf)。我以前在同一个OID(python脚本)上执行过Get操作。可能我错过了等待,或者类似的事情?有没有进一步调试的方法?我再次发现了遗漏的内容。因为我对python完全陌生,一开始我不明白setCmd(…)只是语句,为了使Set命令被发送,我需要一些其他的东西。我发现,如果我执行下一步(setCmd(…),Set命令就会被执行(用嗅探器验证)。顺便问一下,除了使用next之外,还有其他方法应用setCmd吗?感谢您的帮助,您做得很好。现在我已经以不太友好的方式生成了Set命令(您的第一个选项)我尝试了同样的方法,但是用了一种友好的方式,使用MIB模块+符号和带标签的整数。我得到了错误,不明白为什么。MIB包括(namedValues=namedValues((“向上”,1),(“向下”,2),(“待机”,3),)我应该如何发送这些值而不是整数32(1)?@MosheS。不确定您会遇到什么类型的错误。如果您引用MIB(第二个选项),您可以引用通过标签发送的值(例如“up”),或者仍然使用SNMP类型(例如
Integer32(1)
),或者只使用Python类型(例如
1
)因为有了MIB,pysnmp将能够自动将Python类型转换为SNMP类型。
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)))
setCmd(SnmpEngine(),
       CommunityData('public', mpModel=0),
       UdpTransportTarget(('demo.snmplabs.com', 161)),
       ContextData(),
       ObjectType(ObjectIdentity('MY-CUSTOM-MIB', 'myCustomVariable', 0), 'up'))