我在使用PySNMP时遇到了非常奇怪的行为。我想使用POWER-ETHERNET-MIB
mib从Cisco 2960获取PoE信息。当我运行以下代码时:
from pysnmp.hlapi import *
data = {}
for (error_indication,
error_status,
error_index,
values) in nextCmd(SnmpEngine(),
CommunityData('community', mpModel=0),
UdpTransportTarget(('SWITCH', 161), timeout=10),
ContextData(),
ObjectType(ObjectIdentity('POWER-ETHERNET-MIB', 'pethMainPseEntry').addAsn1MibSource('http://mibs.snmplabs.com/asn1/@mib@')),
lexicographicMode=False, lookupNames=True, lookupValues=True):
print('""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""')
print(values)
print(error_indication)
print(error_status)
print(error_index)
print('""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""')
for v in values:
print(v)
oid, text = str(v).split('=')
data[''.join(oid.strip())] = ''.join(text.strip().strip("'"))
print(data)
我只将空字典作为输出。甚至没有错误。我一直在打破这个,这可能是什么原因?
编辑: 相关的堆栈跟踪输出
`;pyasn1.type.error.ValueConstraintError: ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(ConstraintsIntersection(), ValueSizeConstraint(0, 65535)), ValueSizeConstraint(0, 255)), ValueSizeConstraint(1, 32)) failed at: ValueConstraintError("ValueSizeConstraint(1, 32) failed at: ValueConstraintError(b'traphost.community.172.20.1.1.1',)",) at SnmpAdminString`
答案 0 :(得分:0)
实现GETNEXT和GETBULK查询的生成器返回变量绑定的矩阵(2-D数组):
[ [ var_bind, var_bind, ... ],
[ var_bind, var_bind, ... ],
... ]
其中每一行表示位置匹配请求中的变量的响应变量绑定。在GETNEXT的情况下,只能返回一行,但GETBULK是不同的 - 它可以产生许多行作为响应。
由于GETBULK和GETNEXT非常相似,因此pysnmp支持两个生成器的相同通用调用签名。
因此,要理解GETNEXT响应,您需要迭代values
(行),然后遍历每一行(例如列)。我认为你的代码错过了第二次迭代。
for row in values:
for column in row:
oid, value = column
data[oid] = str(value)
这是example脚本。
编辑:
一旦我们知道发生了哪种错误,我认为原因可能是communityIndex
参数默认是从communityName
初始化的。麻烦的是,与communityName
不同,它的大小限制为32个八位字节(通过SNMP-COMMUNITY-MIB定义)。
所以我的建议是明确地将communityIndex
传递给CommunityData
初始化程序:
CommunityData('my-short-id', 'my-unbelievably-long-community-string', mpModel=0)
或者,您可以缩小communityName
以适应32个章程。
此处CommunityData
{{1}} {/ 3}}。