pysnmp不处理大字符串返回

时间:2018-08-02 22:47:48

标签: python pysnmp

我试图使用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禁用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输出完全不同)

1 个答案:

答案 0 :(得分:1)

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

要回答您的问题:

  1. 省略号仅出现在repr()中,如果您对值进行str.prettyPrint()则不会发生
  2. 从本质上讲,它是sequence of tuples。每个元组是(名称,值)。因此,要打印出内容,您可以执行以下操作:

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

可以在here中找到示例。