我终于设法使用以下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失败**
为了解决这个问题,我需要做些什么?
答案 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'))