全部-我正在使用python和pysnmp通过snmp收集Cisco发现协议数据。由于我正在使用CDP,因此我正在使用CISCO-CDP-MIB.my,并且面临的问题是解压缩cdpCacheCapabilities和cdpCacheAddressType的内容。我已经看到了许多示例,并在我的代码中对其进行了尝试,但是它们对我的特定情况没有帮助。请帮助我理解解压缩的原理,这样我不仅可以将它们应用于正在使用的两个MIB,而且还可以应用于其他可能以打包格式返回数据的MIB。 cdpCacheCapabilities的结果应该类似于“ 00000040”,我已经能够打印结果,但是“ 0x”始终位于我的值之前,我只需要该值,而无需使用符号。 cdpCacheAddress的结果应为十六进制表示法的IP地址。对于cdpCacheAddress,我需要先解压缩内容,然后给我留一个十六进制字符串,然后将其转换为IP地址,即“ 192.168.1.10”。请解释您的答案背后的逻辑,以便我可以在其他情况下进行调整。谢谢
from pysnmp.hlapi import *
from pysnmp import debug
import binascii
import struct
#use specific flags or 'all' for full debugging
#debug.setLogger(debug.Debug('dsp', 'msgproc'))
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('10.1.1.1', 161)),
ContextData(),
ObjectType(ObjectIdentity('CISCO-CDP-MIB', 'cdpCacheCapabilities')),
lookupNames=True,
lookupValues=True,
lexicographicMode=False):
if errorIndication:
print(errorIndication)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
break
else:
for varBind in varBinds:
value = varBind[-1]
arg = value.prettyPrint()
print(arg)
#dec = format(value,'x')
#dec = repr(value)
dec = struct.unpack('c',value)
print(dec)
答案 0 :(得分:1)
通过启用MIB查找,您要求pysnmp使用MIB将SNMP变量绑定对(OID和值)转换为对人类友好的内容。
如果您只需要裸露的非格式值,并且假设这两个托管对象的类型为OCTET STRING
,则可以对值调用.asOctets()
或.asNumbers()
方法以获取原始str|bytes
或int
的序列:
for oid, value in varBinds:
raw_string = value.asOctets()
raw_ints = value.asNumbers()
编辑:
一旦有了原始值,就可以将它们转换为任何值:
>>> ''.join(['%.2x' % x for x in b'\x00\x00\x04\x90'])
'00000490'
>>>
>>> '.'.join(['%d' % x for x in (10,0,1,202)])
'10.0.1.202'