Skip to main content
 首页 » 编程设计

snmp中如何在 pysnmp 中加载和遍历自定义 mib

2024年09月07日47虾米哥

我是 SNMP/pysnmp 新手,我正在尝试实现一个使用自定义 MIB 的代理。我正在查看 pysnmp 上的以下示例网站,但我似乎无法让它工作。以下是我正在采取的步骤:

  1. 使用 build-pysnmp-mib 将我的 MIB 文件转换为 pysnmp 模块(成功且没有错误)
  2. 设置 MIB 源并使用 MibBuilder() 加载 MIB 模块
  3. 使用上面引用的示例来设置代理(我唯一添加的是 mibBuilder)
  4. 使用net-snmp的snmpwalk查看加载的MIB:

snmpwalk命令是:

snmpwalk -v3 -u usr-md5-none -l authNoPriv -A authkey1 -E 8000000001020304 -n my-context 127.0.0.1 .1.3.6 

snmpwalk 返回超时错误,在分析通信时(通过在 pysnmp 中启用 I/O 调试),我可以看到代理收到请求,但从不回复。我想这可能与上下文有关,我目前可能无法正确理解。非常感谢任何有关我可能做错的地方的指示。我正在使用following sample MIB为了我的测试。代码如下。谢谢。

#!/usr/local/bin/python 
 
from pysnmp.smi import builder 
from pysnmp.smi import view 
 
from pysnmp.entity import engine 
from pysnmp.entity import config 
from pysnmp.entity.rfc3413 import cmdrsp 
from pysnmp.entity.rfc3413 import context 
from pysnmp.smi import instrum 
from pysnmp.carrier.asynsock.dgram import udp 
from pysnmp.proto.api import v2c 
 
from pysnmp import debug 
 
# Create SNMP engine 
snmpEngine = engine.SnmpEngine() 
 
# Transport setup 
 
# UDP over IPv4 
config.addSocketTransport( 
    snmpEngine, 
    udp.domainName, 
    udp.UdpTransport().openServerMode(('127.0.0.1', 161)) 
) 
 
# SNMPv3/USM setup 
 
# user: usr-md5-none, auth: MD5, priv NONE 
config.addV3User( 
    snmpEngine, 'usr-md5-none', 
    config.usmHMACMD5AuthProtocol, 'authkey1' 
) 
 
# Allow full MIB access for each user at VACM 
config.addVacmUser(snmpEngine, 3, 'usr-md5-none', 'authNoPriv', 
                   (1,3,6,1,2,1), (1,3,6,1,2,1))  
 
# Create an SNMP context with ContextEngineId = 8000000001020304 
snmpContext = context.SnmpContext( 
    snmpEngine, contextEngineId=v2c.OctetString(hexValue='8000000001020304') 
) 
 
# load mibs 
MIBDIR = '/usr/local/share//mibdata' 
mibBuilder = builder.MibBuilder() 
mibSources = mibBuilder.getMibSources() + (builder.DirMibSource(MIBDIR),) 
mibBuilder.setMibSources(*mibSources) 
mibBuilder.loadModules('TOASTER-MIB') 
 
# pass mib to Management Instrumentation Controller and register at SNMP Context 
# under ContextName 'my-context' 
snmpContext.registerContextName( 
    v2c.OctetString('my-context'),            # Context Name 
    instrum.MibInstrumController(mibBuilder)  # Managed Objects - loading my custom TOASTER-MIB 
) 
 
# Register SNMP Applications at the SNMP engine for particular SNMP context 
cmdrsp.GetCommandResponder(snmpEngine, snmpContext) 
cmdrsp.SetCommandResponder(snmpEngine, snmpContext) 
cmdrsp.NextCommandResponder(snmpEngine, snmpContext) 
cmdrsp.BulkCommandResponder(snmpEngine, snmpContext) 
 
# Register an imaginary never-ending job to keep I/O dispatcher running forever 
snmpEngine.transportDispatcher.jobStarted(1) 
 
# Run I/O dispatcher which would receive queries and send responses 
try: 
    snmpEngine.transportDispatcher.runDispatcher() 
except: 
    snmpEngine.transportDispatcher.closeDispatcher() 
    raise 

请您参考如下方法:

您真的需要使用非默认的 ContextEngineId 和 ContextName 吗?如果没有,我建议使用 this example反而。您可以将自定义 MIB 加载到默认 SnmpEngine 的 MIB 树 (mibBuilder) 中,该树可通过以下调用获得:

snmpContext = context.SnmpContext(snmpEngine) 
mibBuilder = snmpContext.getMibInstrum().getMibBuilder() 

还要确保您允许管理员使用 config.addVacmUser() 函数访问您的 OID。

要认识到的另一件重要的事情是,编译后的 pysnmp MIB 在其初始状态下不包含 MIB 变量的实例,而是仅向管理器提供有关代理内容的提示。因此,要使您的代理生效,您必须将托管对象的实例添加到您的 MIB 中,解释如下 in another example .