Python 如何在不同(SNMPv3)上下文中注册MIB模块。在SNMP代理端

Python 如何在不同(SNMPv3)上下文中注册MIB模块。在SNMP代理端,python,snmp,agent,pysnmp,mib,Python,Snmp,Agent,Pysnmp,Mib,我是SNMP新手,我正在尝试在云中创建SNMP代理,它将使用上下文名称来区分设备。我在代理端使用pysnmp。我还将遵循 现在我想知道如何在代理端添加register multiple context name,并在这个context name下注册MIB。都使用相同的非默认MIB 我尝试了www.snmpalabs.com上提供的任何示例代码,但当我使用上下文名称时,我得到了超时或MIB结束 def\uuuu init\uuuuu(self,mibObjects): snmpEngine=e

我是SNMP新手,我正在尝试在云中创建SNMP代理,它将使用上下文名称来区分设备。我在代理端使用pysnmp。我还将遵循

现在我想知道如何在代理端添加register multiple context name,并在这个context name下注册MIB。都使用相同的非默认MIB

我尝试了www.snmpalabs.com上提供的任何示例代码,但当我使用上下文名称时,我得到了超时或MIB结束

def\uuuu init\uuuuu(self,mibObjects):
snmpEngine=engine.snmpEngine()
config.addTransport(
self.\u snmpEngine,udp.domainName,
udp.udptTransport().openServerMode(('127.0.0.1',161)))
config.addV3User(self.\u snmpEngine,'User',config.usmhmmacmd5authoprotocol,'PassCode')
配置addVacmUser(self.\u snmpEngine,3,'User','authNoPriv',(1,3,6,1,4,144555),(1,3,6,1,4,144555))
snmpContext=context.snmpContext(snmpEngine)
响应者(snmpEngine、snmpContext)
mibBuilder=snmpContext.getMibInstrum().getMibBuilder()
loadmib(mibBuilder)
snmpContext.registerContextName(
v2c.OctetString('MyContextName'),
仪表MIB仪表控制器(mibBuilder)
)
MibScalarInstance,=mibBuilder.importSymbols('SNMPv2-SMI','MibScalarInstance')
#导出我们的自定义mib
对于mibObjects中的mibObject:
nextVar,=mibBuilder.importSymbols(mibObject.mibName,
mibObject.objectType)
实例=createVariable(MibScalarInstance,
mibObject.valueFunc,
mibObject.objectType,
nextVar.name,(0,),
nextVar.syntax)
instanceDict={str(nextVar.name)+“Instance”:Instance}
mibBuilder.exportSymbols(mibObject.mibName,
**instanceDict)

我只是粘贴了最小的代码。如果需要更多,请询问。这不是正确的方法吗?那是什么?有什么好的文档或帮助吗?

基本上,您应该有一个
SnmpContext
对象和多个MIB树,每个MIB树都以不同的名称注册到
SnmpContext

# Create an SNMP context with default ContextEngineId (same as SNMP engine ID)
snmpContext = context.SnmpContext(snmpEngine)

# Create multiple independent trees of MIB managed objects (empty so far)
mibTreeA = instrum.MibInstrumController(builder.MibBuilder())
mibTreeB = instrum.MibInstrumController(builder.MibBuilder())

# Register MIB trees at distinct SNMP Context names
snmpContext.registerContextName(v2c.OctetString('context-a'), mibTreeA)
snmpContext.registerContextName(v2c.OctetString('context-b'), mibTreeB)

# 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)
然后您应该能够像这样查询每个MIB树:

snmpwalk -v3 -u usr-md5-none -l authNoPriv -A authkey1 -n context-a 127.0.0.1 .1.3.6
snmpwalk -v3 -u usr-md5-none -l authNoPriv -A authkey1 -n context-b 127.0.0.1 .1.3.6
因为mib树是空的,所以很可能只得到mib的末尾

这是一个有希望的操作系统


或者从从头开始实现自己的SNMP代理,您可以考虑基于相同的技术尝试工具,但使它更容易(希望)。因此,如果我想添加一些东西给MIB树,我应该添加这样的MibTeea= TrimUn.MibInstrumController(Builder,MiBuilder())。?MYTEST-PANEL-DATA::cc1 Test Status=此MIB视图中没有其他变量(已超过MIB树的末尾)。这就是我得到的。你能告诉我一些关于向MIB树添加数据的事情吗?我找不到任何文档或好的示例。你应该调用

MibBuilder
object来填充MIB树。您还需要在加载的MIB中具有托管对象。此外,还可以找到一些相关文档。谢谢Ilya Etingof,您说过“您还需要在加载的MIB中实现您的托管对象”,请您解释一下我们需要做什么,或者给出一些示例。