python net snmp加载MIB

python net snmp加载MIB,python,net-snmp,mib,pysnmp,Python,Net Snmp,Mib,Pysnmp,我正在使用netsnmp的python库对各种交换机执行一些长查询。我希望能够加载新的MIB——但我找不到任何关于如何加载的文档 PySNMP看起来相当复杂,需要我为每个mib创建Python对象(这对我来说是不可伸缩的);因此,我一直使用NetSNMP的库(除了加载mib之外,这些库还不错) 我知道我可以将-m和-m选项与网络snmp命令行工具一起使用,并且有关于预编译网络snmp套件(/configure,make等)和所有MIB的文档(我也假设是在库中);如果Python库不提供加载MIB

我正在使用netsnmp的python库对各种交换机执行一些长查询。我希望能够加载新的MIB——但我找不到任何关于如何加载的文档

PySNMP看起来相当复杂,需要我为每个mib创建Python对象(这对我来说是不可伸缩的);因此,我一直使用NetSNMP的库(除了加载mib之外,这些库还不错)


我知道我可以将
-m
-m
选项与网络snmp命令行工具一起使用,并且有关于预编译网络snmp套件(
/configure
make
等)和所有MIB的文档(我也假设是在库中);如果Python库不提供加载MIB的功能,我是否可以至少配置net snmp以提供Python库对MIB的访问,而无需重新编译?

我终于找到了答案。从
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
命令行选项一样使用
MIBS
环境变量,并且在库级别实现对该变量的支持。这意味着,如果在启动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',)
>>> 
请注意,在调用任何
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',)
>>> 

如果正确配置网络snmp,从技术上讲,您不必初始化或导出任何环境变量

(注意,我使用的是Ubuntu 12.04.1 LTS,因此我真的不必从源代码处编译
net-snmp
,尽管为了完整起见,我将介绍我所做的全部工作,但这只适用于您希望设置一些MIB以通过
net-snmp
或其Python绑定自动插入的情况。)

首先,我做了
sudo apt get安装libsnmp base libsnmp python libsnmp15 snmp

这将安装NetSNMP及其库以及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 MIB downloader软件包还提供了
/usr/bin/download MIB
命令

接下来,使用
snmpconf
命令设置您的网络snmp环境:

$snmpconf-h
/usr/bin/snmpconf[options][FILETOCREATE…]
选项:
-f在不提示的情况下覆盖现有文件
-我将创建的文件安装到/usr/share/snmp中。
-p将创建的文件安装到/home/$USER/.snmp中。
-I DIR将创建的文件安装到DIR中。
-a不要问任何问题,只需阅读当前内容
当前的.conf文件并对其进行注释
-r all | none读取找到的所有或任何.conf文件。
-R文件,。。。读入.conf文件的特定列表。
-g组提出一系列分组问题。
-G列出已知的组。
-c conf_dir使用备用配置目录。
-用更少的建议安静地跑。
-d打开调试输出。
-D打开调试转储程序输出。
我使用了
snmpconf-p
并浏览了菜单项。该过程基本上查找现有的snmp.conf文件(
/etc/snmp/snmp.conf
,默认情况下),并将这些文件与新创建的配置文件合并,该文件将放入
/home/$USER/.snmp/snmp.conf
选项指定的
-p
中。从那时起,您实际上只需要告诉
snmpconf
在哪里查找MIB,但是脚本提供了许多有用的选项,用于在
snmp.conf
中生成配置指令

在完成
snmpconf
之后,您应该拥有一个主要工作的环境。下面是我的(非常简单的)
/home/$USER/.snmp/snmp.conf
的样子:

###########################################################################
#
#snmp.conf
#
#-由snmpconf配置程序创建
#
###########################################################################
#部分:文本mib解析
#
#本节控制文本mib解析器。文本的
#分析MIB是为了转换OID,枚举
#列表,以及。。。往返于文本表示
#和数值表示。
#mibdirs:指定要搜索mib的目录。
#将“+”符号添加到参数的前面会附加新的
#目录到已被搜索的目录列表。
#参数:[+]目录[:目录…]
mibdirs:+/usr/share/mibs/iana:/usr/share/mibs/ietf:/usr/share/mibs/netsnmp:/home/$USERNAME/.snmp/mibs/newmibs
#MIB:指定要搜索和加载的MIB列表。
#将“+”符号添加到参数的前面会附加新的
#已搜索的mib列表中的mib名称。
#参数:[+]mibname[:mibname…]
mibs+ALL
一些陷阱:

  • net snmp
    加载此配置文件时,它不会执行递归目录搜索,因此您必须给出MIB所在目录的绝对路径
  • 如果您选择告诉
    netsnmp
    加载这些目录中的所有300多个mib,这可能会减慢您的snmp查询速度,并且会导致