我正在使用net-snmp的python库在不同的交换机上执行一些长查询。我希望能够加载新的mibs -但我找不到任何有关如何执行此操作的文档。
PySNMP看起来相当复杂,需要我为每个mib创建Python对象(这对我来说不是可伸缩的);所以我只能使用net-snmp的库(除了加载mib这件事之外,这些库还不错)。
我知道我可以在net-snmp命令行工具中使用-m和-M选项,并且有关于预编译net-snmp套件(./configure、make等)的文档。如果Python库不提供加载mibs的能力,那么我是否可以至少配置net-snmp来提供对mibs的python库访问,而无需重新编译?
发布于 2012-02-29 00:18:42
我终于找到了答案。从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.这里的关键部分是,您可以像使用-m命令行option...and一样使用MIBS环境变量,该环境变量支持在库级实现。这意味着如果您在启动MIBS之前定义了Python环境变量,它将影响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',)
>>> 请注意,必须在调用任何netsnmp模块函数之前设置os.environ['MIBS'] (因为这将加载库,并且在此之后的任何环境更改都不会产生任何影响)。
您也可以(显然)在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',)
>>> 发布于 2012-12-22 00:23:18
如果正确配置net-snmp,从技术上讲,您不必初始化或导出任何环境变量。
(请注意,我使用的是Ubuntu12.04.1LTS,所以我真的不需要从源代码编译net-snmp,尽管我将完整地介绍我所做的全部工作,但只有当您想要设置一些net-snmp或它的Python绑定自动插入MIB时,这个方法才适用。)
首先我做了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命令设置您的net-snmp环境:
$ 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.我使用了snmpconf -p并浏览了菜单项。该过程基本上查找现有的snmp.conf文件(默认情况下为/etc/snmp/snmp.conf),并将这些文件与新创建的配置文件合并,该配置文件将放入由-p选项指定的/home/$USER/.snmp/snmp.conf中。从那时起,您实际上只需要告诉snmpconf在哪里查找MIB,但是脚本为在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以下是一些问题:
net-snmp加载此配置文件时,它不会执行递归目录搜索,因此您必须给出MIB所在目录的绝对路径。net-snmp加载这些目录中的所有300+ MIB,则可能会减慢您的STDERR查询速度,并且肯定会有一些内容被转储到STDERR,因为有些MIB可能会过期、错误,或者试图从不存在的MIB中导入定义,或者这些MIB不是软件包下载的。您的选择是:告诉snmpconf您希望如何处理这些错误,或者找出丢失或过时的内容并自己下载MIB。如果您选择后者,您可能会发现自己陷入了MIB rabbithole,所以请记住这一点。就我个人而言,我建议你加载它们,然后向后工作,只加载对轮询特定设备有意义的给定MIB。snmp.conf中搜索路径中指定的目录顺序很重要,特别是当一些MIB引用或依赖于其他MIB时。我犯了一个错误,我只是简单地将iana目录中的MIB文件移到了ietf目录中。我确信有一种方法可以通过编程找出哪些MIB依赖于其他MIB,并使它们愉快地共存于单个目录中,但我不想浪费大量时间来解决这一问题。这个故事的寓意是,如果你有一个合适的snmp.conf,你应该能够做到这一点:
$ 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输出,但是如果您愿意,可以通过snmp.conf配置指令配置您的环境将STDERR转储到日志文件。
希望这能有所帮助。
https://stackoverflow.com/questions/7923548
复制相似问题