pythonset命令_关于python:如何为我的专有MIB生成Set命令

本文围绕Python脚本使用pysnmp库对专有MIB进行操作展开。作者先成功生成获取命令,后尝试将脚本转换为设置命令时遇到诸多问题,如地址解析失败、命令未完成等。经调试,最终实现了对OID及特定实例的设置和获取操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我终于设法使用以下python脚本生成了对我的专有MIB的"获取命令":

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种不同的方式打印仅用于学习过程。

现在,我试图模仿相同的脚本,同时将其转换为"设置命令"(没有成功)。有很多例子,但不适合。因此,我尝试了以下方法:

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是可读写的Integer(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]

getaddrinfo中的文件" C: Program Files Python35 lib socket.py",行732,用于_socket.getaddrinfo(主机,端口,家庭,类型,原型,标志)中的res:socket.gaierror:[Errno 11004] getaddrinfo失败

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

追溯(最近一次通话):

文件",第3行,在

文件" 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中引发错误。PySnmpError('错误的IPv4 / UDP传输地址%s:%s'%('@'。join([transAddAddr中x的str(x)),sys.exc_info()[1]))pysnmp.error.PySnmpError:错误的IPv4 / UDP传输地址1 @ 0 @。@ 0 @。@ 1 @。@ 1 @ 3 @ 4:[Errno 11004] getaddrinfo失败**

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

您必须将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。 如果要以更人性化的方式进行操作,可以将OID替换为MIB模块+符号,并将整数替换为标签(如MIB中所述):

setCmd(SnmpEngine(),

CommunityData('public', mpModel=0),

UdpTransportTarget(('demo.snmplabs.com', 161)),

ContextData(),

ObjectType(ObjectIdentity('MY-CUSTOM-MIB', 'myCustomVariable', 0), 'up'))

这是一个工作示例。

我已经尝试了您建议的脚本,但仍然缺少某些内容。我已经在上面编辑了我的问题

我发现了自己的错误,我错过了UdpTransportTarget中的辅助功能。现在,我可以运行脚本了,没有任何错误。我的问题是Set命令实际上没有完成(我通过MIB浏览器执行Get commanf)。我设法在相同的OID之前执行了Get操作(python脚本)。也许我错过了等待,或者类似的事情?有办法进一步调试吗?

我再次发现缺少的东西。因为我是python的新手,所以起初我并不理解setCmd(...)仅是语句,为了使Set命令得以发送,我还需要其他东西。我发现如果我执行下一个(setCmd(...)),则会执行Set命令(使用嗅探器进行验证)。顺便说一句,除了使用next之外,还有另一种方法可以应用setCmd吗?感谢您的帮助,您做得很好。

现在,我已经设法以一种不太友好的方式(您的第一个选择)生成了一个Set Command,我尝试以一种友好的方式使用MIB模块+符号和带有标签的Integer来执行相同的操作。我收到错误,不明白为什么。 MIB包括(namedValues = NamedValues((" up",1),(" down",2),(" standby",3),))我应该如何发送这些值而不是Integer32(1)?

@MosheS。不确定您遇到的是哪种错误。如果引用MIB(第二个选项),则可以引用按标签发送的值(例如up),或者仍使用SNMP类型(例如Integer32(1)),或者仅使用Python类型(例如1),因为MIB pysnmp将能够自动将Python类型转换为SNMP类型。

看来我的MIB对python是未知的。我已将其转换为.py并将其复制到与SNMPv2-MIB一起找到的其他mib文件夹中。我需要在哪里放置MIB文件?如果我设法设置OID或从OID获取值,这不是说我的MIB对python是"已知"的吗?

我想我知道是什么问题。我几乎可以肯定地说出我的MIB对python是"已知的"。而且我知道我的Get / Set请求缺少关键信息。我发送了MIB模块(SL-XPDR-MIB)和符号(xpdrMuxInbandAdmin),但没有提供从中获取值的实例(即1295360.1295360)。所以,现在我只需要知道如何将Symbol与Instance结合在一起?当前,我具有以下ObjectType声明:" ObjectType(ObjectIdentity(SL-XPDR-MIB,xpdrMuxInbandAdmin,0),Integer32(1))我需要在哪里放置实例?

@MosheS。在您的示例中,0是可能为标量值(例如非表)的实例ID。因此,它等效于SL-XPDR-MIB::xpdrMuxInbandAdmin.0。您可以尝试SNMP遍历整个MIB以确定那里有可用的实例(如果有表)。这是有关此问题的文档。

我实际上知道我想从它们中读取Integer32值的所有实例。这些实例之一是1295360.1295360(SL-XPDR-MIB :: xpdrMuxInbandAdmin.1295360.1295360)。我应该如何正确写ObjectIdentity?我尝试了" ObjectType(ObjectIdentity(SL-XPDR-MIB,xpdrMuxInbandAdmin,1295360,1295360)))"和" ObjectType(ObjectIdentity(SL-XPDR-MIB,xpdrMuxInbandAdmin,1295360.1295360)))"并收到错误。正确的做法是什么?

我设法执行了"设置并获取"到我的专有MIB的操作。通过使用以下脚本行" ObjectType(ObjectIdentity(SL-XPDR-MIB,xpdrMuxInbandAdmin,1295360,1295360),Integer32(2))),我成功地设法执行了OID +特定实例的设置。顺便说一句,我还尝试将"人性化"的方式与名称值(而非数字语法)一起使用,并成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值