我正在尝试使用PySNMP
从cisco路由器获取一些snmp变量,但我使用prettyprint
获取十六进制输出,而不是我从普通snmp浏览器获得的输出。
我尝试了多个编码(hex, utf-8 and ascii
)并且没有编码,总是不符合我的期望。
有什么想法吗? 感谢
开始发现10.148.8.15
1.3.6.1.2.1.1.1.0 = 0x436973636f20494f5320536f6674776172652c20494f532d584520536f66747761726520285838365f36345f4c494e55585f494f53442d554e4956455253414c4b392d4d292c2056657273696f6e2031352e3228342953352c2052454c4541534520534f4654574152452028666331290d0a546563686e6963616c20537570706f72743a20687474703a2f2f7777772e636973636f2e636f6d2f74656368737570706f72740d0a436f707972696768742028632920313938362d3230313420627920436973636f2053797374656d732c20496e632e0d0a436f6d70696c6564205475652032352d4665622d31342031313a3336206279206d63707265
result = {'error': 1, 'value': "default"}
cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
cmdgen.CommunityData(community),
cmdgen.UdpTransportTarget((destination, 161)),
cmdgen.MibVariable(oid)
)
# Check for errors and print out results
if errorIndication:
print(errorIndication)
else:
if errorStatus:
result['error'] = 1
# print('%s at %s' % (
# errorStatus.prettyPrint(),
# errorIndex and varBinds[int(errorIndex)-1] or '?'
# )
# )
else:
result['error'] = 0
for name, val in varBinds:
print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
result['value'] = val.prettyPrint().encode("ascii")
答案 0 :(得分:0)
这是因为Cisco SNMP Agent报告控制字符(\ n)可能会破坏脚本输出的可能性。有几种方法可以解决这个问题:
传递lookupValues = True,如this example所示。然后pysnmp将尝试在MIB上查找此特定OID的正确输出格式。为此,pysnmp必须能够找到并加载pysnmp格式的MIB文件。
添加一些代码以在看到0x前缀时触发十六进制字符串解码器:
s =' 436973636f ... 06d63707265'
print(' .join([chr(int(s [x:x + 2],16))for x in range(0,len(s),2)]))
Cisco IOS软件,IOS-XE软件......由mcpre编译于星期二25 - 2月14日11:36