我正在使用net snmp的python库在各种交换机上执行一些长查询。我希望能够加载新的MIB—但是找不到任何关于如何执行此操作的文档。
PySNMP看起来相当复杂,需要我为每个mib创建Python对象(这对我来说不可伸缩);因此我不得不使用net snmp的库(除了加载mib之外,这些库还不错)。
我知道我可以在net snmp命令行工具中使用-m
和-M
选项,还有关于对所有mib预编译netsnmp套件(./configure
,make
等)的文档(我也假设这些库中有);如果Python库不提供加载mib的能力,我至少可以配置netsnmp来提供我的python库无需重新编译就可以访问mib?
我终于找到了答案。从
snmpcmd(1)
手册页:这里的关键部分是,您可以使用
MIBS
环境变量,就像使用-m
命令行选项一样……而且对它的支持是在库级别实现的。这意味着,如果在启动Python之前定义了MIBS
环境变量,它将影响netsnmp
库的行为:注意,必须在调用任何
netsnmp
模块函数之前设置os.environ['MIBS']
(因为这将加载库,之后的任何环境更改都不会产生影响)。您还可以(显然)在Python之外设置环境变量:
(第一篇帖子!!!)
从技术上讲,如果正确配置net snmp,则不必初始化或导出任何环境变量。
(注意到我在Ubuntu 12.04.1lts上,所以我真的不需要从源代码编译
net-snmp
,即使我会完整地介绍我所做的工作,但这应该只在您希望设置一些mib,以便通过net-snmp
或其Python绑定自动插入时才适用。)首先我做了
sudo apt-get install libsnmp-base libsnmp-python libsnmp15 snmp
这将安装net snmp及其库以及Python绑定。它还会在
/usr/share/mibs/netsnmp/
中安装一些默认mib(仅用于net-snmp
)。如果您想获取其他IETF/IANA MIB,请执行以下操作:sudo apt-get install snmp-mibs-downloader
如您所料,它会将大量其他标准MIB(包括IF-MIB等)下载到
/var/lib/mibs/iana
、/var/lib/mibs/ietf
以及/usr/share/mibs/iana
和/usr/share/mibs/ietf
。如果您想再次下载mib,snmp-mibs-downloader
包还提供/usr/bin/download-mibs
命令。接下来,使用
snmpconf
命令设置您的网络snmp环境:我用
snmpconf -p
浏览了菜单项。该进程基本上查找现有的snmp.conf文件(默认情况下为/etc/snmp/snmp.conf
),并将这些文件与新创建的配置文件合并,后者将放入由-p
选项指定的/home/$USER/.snmp/snmp.conf
中。从那以后,您只需要告诉snmpconf
在哪里查找mib,但是脚本提供了许多有用的选项,用于在snmp.conf
中生成配置指令。完成
snmpconf
后,您应该有一个主要的工作环境。以下是我的(非常简单的)骨骼/home/$USER/.snmp/snmp.conf
的样子:有些问题:
net-snmp
加载此配置文件时,它不会执行递归目录搜索,因此您必须给出mib所在目录的绝对路径。net-snmp
加载这些目录中的所有300多个mib,则可能会减慢您的SNMP查询速度,并且一定会有一些东西转储到STDERR
,因为某些mib可能已过期、错误,或者试图从不存在或未被包下载的mib导入定义。您的选择是:告诉snmpconf
您希望如何处理这些错误,或者找出丢失或过期的内容,然后自己下载MIB。如果你选择后者,你可能会发现自己陷入了MIB的困境,所以请记住这一点。就我个人而言,我建议您将它们全部加载,然后反向工作,只加载给定的mib,这对于轮询特定设备是有意义的。snmp.conf
的搜索路径中指定的目录的顺序很重要,特别是当某些mib引用或依赖于其他mib时。我犯了一个错误,我只是通过在iana
目录中获取一个MIB文件并将其移动到ietf
目录中就可以离开。我确信有一种方法可以通过编程找出哪些mib依赖于其他mib,并使它们在一个目录中愉快地共存,但我不想浪费大量时间试图找出这一点。这个故事的寓意是,如果您有一个正确的snmp.conf,那么您应该能够这样做:
仅供参考,我省略了一组
STDERR
输出,但是如果您希望通过snmp.conf
配置指令将STDERR
转储到日志文件,您可以再次配置您的环境。希望这有帮助。
相关问题 更多 >
编程相关推荐