使用MIB文件时PySNMP错误

2 投票
1 回答
5830 浏览
提问于 2025-04-17 11:09

我正在尝试在PySNMP中使用MIB文件。代码其实很简单,没有什么复杂的。只是想获取某个OID下的信息。我的代码如下:

#!/usr/local/bin/python2.7

from pysnmp.smi import builder, view, error
from pysnmp.entity.rfc3413.oneliner import cmdgen

cmdGen = cmdgen.CommandGenerator()
mibBuilder = builder.MibBuilder()
mibPath = mibBuilder.getMibPath() + ( '/path/to/command/mibs', )
mibBuilder.setMibPath( *mibPath )
mibBuilder.loadModules( 
    'MIB-File',
    )
mibView = view.MibViewController( mibBuilder )
errorIndication, errorStatus, errorIndex, \
                 varBindTable = cmdGen.nextCmd( 
    cmdgen.CommunityData( 'Name', 'Community' ),
    cmdgen.UdpTransportTarget( ( 'IP Address', 161 ) ),
    ( ( '', 'serverName' ), ),
    )

print varBindTable

我知道输入的数据是准确的,因为当我使用asynCommandGenerator.asyncNextCmd,用同样的udpTransportTargetCommunityData时,它是可以正常工作的。而且我看到的错误很明显是和MibBuilder组件有关。

我遇到的错误是:

追踪记录(最近的调用在最前面):

文件 "./snmpcollectortest.py",第11行,

'NS-MIB-smiv2',

文件 "/usr/lib/python2.7/site-packages/pysnmp-4.2.1-py2.7.egg/pysnmp/smi/builder.py",第221行,在 loadModules 中

pysnmp.smi.error.SmiError: MIB模块 "/path/to/command/mibs/MIB-File.py" 加载错误:在搜索路径中找不到 MIB 文件 "ASN1.py[co]"

更新:

我发现我没有安装M2Crypto,这就是我找不到ASN1.py的原因。不过我已经解决了这个问题,但仍然遇到同样的错误。

1 个回答

7

getMibPath()setMibPath()这两个方法已经过时了。除非你使用.egg格式的pysnmp或者它的MIB模块,否则它们是无法工作的。

你应该始终使用getMibSources()setMibSources()这两个方法。这两个方法在使用.egg和文件的设置时都能正常工作。

mibPath = mibBuilder.getMibSources() + (builder.DirMibSource('/path/to/command/mibs'),)
mibBuilder.setMibSources(*mibPath)
mibBuilder.loadModules(
    'MIB-File',
)

顺便说一下,pysnmp并不需要M2Crypto,所需的库是pyasn1和pycrypto(仅用于SNMPv3的加密)。

撰写回答