pysnmp 不处理大字符串 returns

pysnmp not handling large string returns

我正在尝试使用基于示例的以下代码,使用 bulkget 命令生成器遍历 sysORTable:

cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.bulkCmd(
    cmdgen.UsmUserData(user, 
                    authKey=authKey, 
                    privKey=privKey, 
                    authProtocol=authProto, 
                    privProtocol=privProto, 
                    securityEngineId=None
            ),
    cmdgen.UdpTransportTarget((sHost, 161)),
    0 , 25, 
    *[cmdgen.MibVariable(oid) for oid in sOID] )

但是从代理返回的结果超过了 MIB 查找规定的 255 个字符限制。我找到了解决此问题的两个解决方法:

  1. 更改pysnmp/smi/mibs/SNMPv2-TC.py中DisplayString的最大长度值:subtypeSpec = OctetString.subtypeSpec + ValueSizeConstraint(0, 512)
  2. 使用 lookupMib=False
  3. 在 cmdgen 中禁用 MIB 查找

然而,这两个修复程序虽然允许脚本完成,但似乎截断了输出。例如:

[ObjectType(ObjectIdentity(<ObjectName value object at 0x7f1c04686cd0 tagSet <TagSet object at 0x7f1c0c88dad0 tags 0:0:6> payload [1.3.6.1.2.1.1.9.1.3.106]>), <DisplayString value object at 0x7f1c04623150 subtypeSpec <ConstraintsIntersection object at 0x7f1c04a64490 consts <ValueSizeConstraint object at 0x7f1c0756c510 consts 0, 65535>, <ValueSizeConstraint object at 0x7f1c04a64450 consts 0, 512>> tagSet <TagSet object at 0x7f1c0c88d5d0 tags 0:0:4> encoding iso-8859-1 payload [Agent capabiliti...B
File name: sys]>)]

注意省略号和换行符。

两个问题:

  1. 如何修复输出截断问题?
  2. 这封邮件的格式是什么?我该如何解压它? (与带有键和值的标准 get 输出完全不同)

首先,这似乎是您的 SNMP 代理中的错误 - 它们不应溢出字符串。从这个意义上说,pysnmp 做得很好。 ;-)

回答您的问题:

  1. 省略号仅出现在 repr() 中,如果您对值
  2. 执行 str.prettyPrint() 则不会出现
  3. 本质上,它是 sequence of tuples。每个元组都是(名称,值)。所以要打印出来你可以这样做:

:

for varBind in varBinds:
    print(' = '.join([x.prettyPrint() for x in varBind]))

可以找到示例here