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 个字符限制。我找到了解决此问题的两个解决方法:
- 更改pysnmp/smi/mibs/SNMPv2-TC.py中
DisplayString
的最大长度值:subtypeSpec = OctetString.subtypeSpec + ValueSizeConstraint(0, 512)
- 使用
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]>)]
注意省略号和换行符。
两个问题:
- 如何修复输出截断问题?
- 这封邮件的格式是什么?我该如何解压它? (与带有键和值的标准 get 输出完全不同)
首先,这似乎是您的 SNMP 代理中的错误 - 它们不应溢出字符串。从这个意义上说,pysnmp 做得很好。 ;-)
回答您的问题:
- 省略号仅出现在
repr()
中,如果您对值 执行 str
或 .prettyPrint()
则不会出现
- 本质上,它是 sequence of tuples。每个元组都是(名称,值)。所以要打印出来你可以这样做:
:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
可以找到示例here。
我正在尝试使用基于示例的以下代码,使用 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 个字符限制。我找到了解决此问题的两个解决方法:
- 更改pysnmp/smi/mibs/SNMPv2-TC.py中
DisplayString
的最大长度值:subtypeSpec = OctetString.subtypeSpec + ValueSizeConstraint(0, 512)
- 使用
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]>)]
注意省略号和换行符。
两个问题:
- 如何修复输出截断问题?
- 这封邮件的格式是什么?我该如何解压它? (与带有键和值的标准 get 输出完全不同)
首先,这似乎是您的 SNMP 代理中的错误 - 它们不应溢出字符串。从这个意义上说,pysnmp 做得很好。 ;-)
回答您的问题:
- 省略号仅出现在
repr()
中,如果您对值 执行 - 本质上,它是 sequence of tuples。每个元组都是(名称,值)。所以要打印出来你可以这样做:
str
或 .prettyPrint()
则不会出现
:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
可以找到示例here。