PySNMP不从生成器返回数据

时间:2017-06-01 11:24:06

标签: python snmp pysnmp

我在使用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`

1 个答案:

答案 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}}。