首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python net-snmp加载mibs

python net-snmp加载mibs
EN

Stack Overflow用户
提问于 2011-10-28 07:16:23
回答 2查看 11.2K关注 0票数 4

我正在使用net-snmp的python库在不同的交换机上执行一些长查询。我希望能够加载新的mibs -但我找不到任何有关如何执行此操作的文档。

PySNMP看起来相当复杂,需要我为每个mib创建Python对象(这对我来说不是可伸缩的);所以我只能使用net-snmp的库(除了加载mib这件事之外,这些库还不错)。

我知道我可以在net-snmp命令行工具中使用-m-M选项,并且有关于预编译net-snmp套件(./configuremake等)的文档。如果Python库不提供加载mibs的能力,那么我是否可以至少配置net-snmp来提供对mibs的python库访问,而无需重新编译?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-29 00:18:42

我终于找到了答案。从snmpcmd(1)手册页:

代码语言:javascript
复制
   -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库的行为:

代码语言:javascript
复制
$ 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外部设置环境变量:

代码语言:javascript
复制
$ export MIBS='UPS-MIB:SNMPv2-SMI'
$ python
>>> import netsnmp
>>> oid = netsnmp.Varbind('upsAlarmOnBattery.0')
>>> netsnmp.snmpget(oid, Version=1, DestHost='myserver', Community='public')
('0',)
>>> 
票数 3
EN

Stack Overflow用户

发布于 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环境:

代码语言:javascript
复制
$ 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的样子:

代码语言:javascript
复制
###########################################################################
#
# 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

以下是一些问题:

  1. net-snmp加载此配置文件时,它不会执行递归目录搜索,因此您必须给出MIB所在目录的绝对路径。
  2. 如果您选择告诉net-snmp加载这些目录中的所有300+ MIB,则可能会减慢您的STDERR查询速度,并且肯定会有一些内容被转储到STDERR,因为有些MIB可能会过期、错误,或者试图从不存在的MIB中导入定义,或者这些MIB不是软件包下载的。您的选择是:告诉snmpconf您希望如何处理这些错误,或者找出丢失或过时的内容并自己下载MIB。如果您选择后者,您可能会发现自己陷入了MIB rabbithole,所以请记住这一点。就我个人而言,我建议你加载它们,然后向后工作,只加载对轮询特定设备有意义的给定MIB。
  3. snmp.conf中搜索路径中指定的目录顺序很重要,特别是当一些MIB引用或依赖于其他MIB时。我犯了一个错误,我只是简单地将iana目录中的MIB文件移到了ietf目录中。我确信有一种方法可以通过编程找出哪些MIB依赖于其他MIB,并使它们愉快地共存于单个目录中,但我不想浪费大量时间来解决这一问题。

这个故事的寓意是,如果你有一个合适的snmp.conf,你应该能够做到这一点:

代码语言:javascript
复制
$ 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转储到日志文件。

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7923548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档