我无法理解自定义 MIB 的 Snmp GET 查询结果

I can't understand the result of a Snmp GET query for my custom MIB

专有 MIB 的 GET 查询结果为:(None、None、None、[])。 这个结果是什么意思?

这是 python 脚本:

>>>g= getCmd(SnmpEngine(),
...         CommunityData('admin'),
...         UdpTransportTarget(('10.0.1.134', 161)),
...         '1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360'
)
>>>next(g)
(None, None, None, [])

我添加了调试行并得到以下结果:

>>> from pysnmp.hlapi import *
>>> from pysnmp.debug import setLogger, Debug
>>>
>>> setLogger(Debug('msgproc', 'secmod'))
2017-02-21 10:27:44,322 pysnmp: running pysnmp version 4.3.2
2017-02-21 10:27:44,322 pysnmp: debug category 'msgproc' enabled
2017-02-21 10:27:44,322 pysnmp: debug category 'secmod' enabled
>>>
>>>
>>> g= getCmd(SnmpEngine(),
...              CommunityData('admin'),
...              UdpTransportTarget(('10.0.1.134', 161)),
...              '1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360'
...     )
>>> next(g)
(None, None, None, [])

我什至尝试添加缺少的 ContextData() 并得到以下结果:

>>> from pysnmp.hlapi import *
>>> from pysnmp.debug import setLogger, Debug
>>> setLogger(Debug('msgproc', 'secmod'))
2017-02-21 10:29:41,640 pysnmp: running pysnmp version 4.3.2
2017-02-21 10:29:41,640 pysnmp: running pysnmp version 4.3.2
2017-02-21 10:29:41,640 pysnmp: debug category 'msgproc' enabled
2017-02-21 10:29:41,640 pysnmp: debug category 'msgproc' enabled
2017-02-21 10:29:41,640 pysnmp: debug category 'secmod' enabled
2017-02-21 10:29:41,640 pysnmp: debug category 'secmod' enabled
>>> g= getCmd(SnmpEngine(),
...              CommunityData('admin'),
...              UdpTransportTarget(('10.0.1.134', 161)),
...              ContextData(),
...              '1.3.6.1.4.1.4515.1.8.1.1.1.8.1295360.1295360'
... )
>>> next(g)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\asyncore\sync\cmdgen.py", line 107, in getCmd
 File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\asyncore\cmdgen.py", line 127, in getCmd
 File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\hlapi\varbinds.py", line 36, in makeVarBinds
 File "C:\Program Files\Python35\lib\site-packages\pysnmp-4.3.2-py3.5.egg\pysnmp\smi\rfc1902.py", line 845, in resolveWithMib
 pysnmp.smi.error.SmiError: MIB object ObjectIdentity('1') is not  OBJECT-TYPE (MIB not loaded?)
  >>>

你能看出我做错了什么吗? 难道是我使用其他 MIB 文件将我的专有 MIB 转换为 .py 格式这一事实以某种方式改变了我的 MIB? 您不认为我应该更好地对整个 MIB 树进行 mibdump.py 转换(不使用 http 源)吗?

TL;RD;您缺少 contextData 参数:

errorIndication, errorStatus, errorIndex, varBinds = next(
   getCmd(SnmpEngine(),
       CommunityData('public'),
       UdpTransportTarget(('demo.snmplabs.com', 161)),
       ContextData(),
       ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0')),
       ObjectType(ObjectIdentity('1.3.6.1.2.1.1.6.0')))

)

如您在 examples or documentation 中所见。

生成的元组解压为 errorIndicationerrorStatuserrorIndexvarBinds 组件:

  • non-false errorIndication 显示来自本地或远程 SNMP 引擎的硬错误
  • non-false errorStatus 表示来自远程 SNMP 引擎
  • 的 pre-defined SNMP 错误代码之一
  • varBinds 是远程 SNMP 引擎为响应您的请求而发送的 OID-value 对序列

(None, None, None, []) return 看起来远程 SNMP 引擎没有将任何 OID-value 对放入响应 PDU。为了解决这个问题,我会打开 pysnmp 调试:

from pysnmp.debug import setLogger, Debug

setLogger(Debug('msgproc', 'secmod'))

查看您发出的是什么以及来自远程端的响应是什么。

我的猜测是,由于您放错了 OID 参数,实际上您发送的是空的 OID-values 列表,因此远程端没有任何响应。