我正在使用net-snmp的python库在各种交换机上进行一些长查询。我希望能够加载新的mibs - 但我找不到任何关于如何执行此操作的文档。
PySNMP看起来相当复杂,需要我为每个mib创建Python对象(不能为我扩展);所以我坚持使用net-snmp的库(除了加载mib的东西之外还不错)。
我知道我可以在net-snmp命令行工具中使用-m
和-M
选项,并且有关于预编译net-snmp套件的文档(./configure
, make
等)与所有的mibs(我也假设进入图书馆);如果Python库不提供加载mib的能力,我是否至少可以配置net-snmp来提供我的python库访问mib而无需重新编译?
答案 0 :(得分:3)
毕竟我找到了答案。从snmpcmd(1)
手册页:
-m MIBLIST
Specifies a colon separated list of MIB modules (not
files) to load for this application. This overrides (or
augments) the environment variable MIBS, the snmp.conf
directive mibs, and the list of MIBs hardcoded into the
Net-SNMP library.
这里的关键部分是您可以像使用MIBS
命令行选项一样使用-m
环境变量...并且在库级别实现对此的支持。这意味着如果在启动Python之前定义MIBS
环境变量,它将影响netsnmp
库的行为:
$ python
Python 2.7.2 (default, Oct 27 2011, 01:40:22)
[GCC 4.6.1 20111003 (Red Hat 4.6.1-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import netsnmp
>>> os.environ['MIBS'] = 'UPS-MIB:SNMPv2-SMI'
>>> oid = netsnmp.Varbind('upsAlarmOnBattery.0')
>>> netsnmp.snmpget(oid, Version=1, DestHost='myserver', Community='public')
('0',)
>>>
请注意,您必须在调用任何os.environ['MIBS']
模块函数之前设置netsnmp
(因为这会加载库并且在此之后任何环境都会发生变化,这将不会产生任何影响)
你(显然)也可以在Python之外设置环境变量:
$ export MIBS='UPS-MIB:SNMPv2-SMI'
$ python
>>> import netsnmp
>>> oid = netsnmp.Varbind('upsAlarmOnBattery.0')
>>> netsnmp.snmpget(oid, Version=1, DestHost='myserver', Community='public')
('0',)
>>>
答案 1 :(得分:2)
(First Post !!!)
如果正确配置net-snmp,您在技术上不必初始化或导出任何环境变量。
(注意到我在Ubuntu 12.04.1 LTS上,所以我真的没有从源代码编译net-snmp
,尽管我将完全覆盖我所做的全部内容,但这应该是实际上只有在你想要设置一些MIB被net-snmp
或它的Python绑定自动插入时才适用。)
首先我做了sudo apt-get install libsnmp-base libsnmp-python libsnmp15 snmp
这将安装net-snmp及其库以及Python绑定。它还在net-snmp
中安装了一些默认MIB(仅适用于/usr/share/mibs/netsnmp/
)。如果您想抓住一堆其他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
和{{1 }}。如果您想再次下载MIB,/usr/share/mibs/ietf
包还会为您提供snmp-mibs-downloader
命令。
接下来,使用/usr/bin/download-mibs
命令设置net-snmp环境:
snmpconf
我使用了$ snmpconf -h
/usr/bin/snmpconf [options] [FILETOCREATE...]
options:
-f overwrite existing files without prompting
-i install created files into /usr/share/snmp.
-p install created files into /home/$USER/.snmp.
-I DIR install created files into DIR.
-a Don't ask any questions, just read in current
current .conf files and comment them
-r all|none Read in all or none of the .conf files found.
-R file,... Read in a particular list of .conf files.
-g GROUP Ask a series of GROUPed questions.
-G List known GROUPs.
-c conf_dir use alternate configuration directory.
-q run more quietly with less advice.
-d turn on debugging output.
-D turn on debugging dumper output.
并浏览了菜单项。该过程基本上查找现有的snmp.conf文件(默认情况下为snmpconf -p
),并将其与新创建的配置文件合并,该文件将放入/etc/snmp/snmp.conf
选项指定的/home/$USER/.snmp/snmp.conf
中。从那时起,你真的只需要告诉-p
在哪里寻找MIB,但是脚本提供了许多有用的选项,用于在snmpconf
中生成配置指令。
完成snmp.conf
后,您应该拥有一个充满活力的工作环境。这就是我的(非常简陋)snmpconf
的样子:
/home/$USER/.snmp/snmp.conf
一些问题:
###########################################################################
#
# snmp.conf
#
# - created by the snmpconf configuration program
#
###########################################################################
# SECTION: Textual mib parsing
#
# This section controls the textual mib parser. Textual
# mibs are parsed in order to convert OIDs, enumerated
# lists, and ... to and from textual representations
# and numerical representations.
# mibdirs: Specifies directories to be searched for mibs.
# Adding a '+' sign to the front of the argument appends the new
# directory to the list of directories already being searched.
# arguments: [+]directory[:directory...]
mibdirs : +/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp:/home/$USERNAME/.snmp/mibs/newmibs
# mibs: Specifies a list of mibs to be searched for and loaded.
# Adding a '+' sign to the front of the argument appends the new
# mib name to the list of mibs already being searched for.
# arguments: [+]mibname[:mibname...]
mibs +ALL
加载此配置文件时,它不会执行递归目录搜索,因此您必须提供MIB所在目录的绝对路径。net-snmp
加载这些目录中的所有300多个MIB,可能会减慢您的SNMP查询速度,并且由于事实,必然会有一些事情被转储到net-snmp
某些MIB要么过时,要么错误,要么尝试从不存在或未被包下载的MIB导入定义。您可以选择:告诉STDERR
您希望如何处理这些错误,或找出丢失或过期的内容并自行下载MIB。如果你选择后者,你可能会发现自己正在使用MIB rabbithole,所以请记住这一点。我个人建议你加载它们,然后向后工作只加载给轮询特定设备有意义的给定MIB。snmpconf
中的搜索路径中指定的目录的顺序很重要,尤其是在某些MIB引用或依赖其他MIB的情况下。我做了一个错误,我只是通过在snmp.conf
目录中取一个MIB文件并将其移动到iana
目录而离开。我确信有一种方法可以通过编程方式找出哪些MIB依赖于其他MIB并让它们愉快地共存于一个目录中,但我不想浪费大量时间来解决这个问题。故事的寓意是,如果你有一个合适的snmp.conf,你应该能够做到这一点:
ietf
仅供参考我省略了一堆$ python
>>> import netsnmp
>>> oid = netsnmp.VarList(netsnmp.Varbind('dot1qTpFdbPort'))
>>> res = netsnmp.snmpwalk(oid, Version=2, DestHost='10.0.0.1', Community='pub')
>>> print res
('2', '1')
>>>
输出,但如果您希望通过STDERR
配置指令,您可以再次配置环境以将STDERR
转储到日志文件。
希望这有帮助。