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

2024-05-20 22:04:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我是SNMP新手,我正在尝试在云中创建SNMP代理,它将使用上下文名称来区分设备。我在代理端使用pysnmp。我也遵循的样本程序中提供的 http://snmplabs.com/pysnmp/examples/contents.html

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

我尝试了所有的样本代码www.snmpalabs.com,但当我使用上下文名称时,会得到超时或MIB结束。你知道吗

def __init__(self, mibObjects):

 snmpEngine = engine.SnmpEngine()

 config.addTransport(
      self._snmpEngine, udp.domainName,                              
      udp.UdpTransport().openServerMode(('127.0.0.1', 161)))

 config.addV3User(self._snmpEngine, 'User', config.usmHMACMD5AuthProtocol, 'PassCode')

 config.addVacmUser(self._snmpEngine, 3, 'User', 'authNoPriv', (1, 3, 6, 1, 4, 1, 44555), (1, 3, 6, 1, 4, 1, 44555))

 snmpContext = context.SnmpContext(snmpEngine)

        responder(snmpEngine,snmpContext)

 mibBuilder = snmpContext.getMibInstrum().getMibBuilder()

 loadmib(mibBuilder)

 snmpContext.registerContextName(
                 v2c.OctetString('MyContextName'),
                 instrum.MibInstrumController(mibBuilder)
        )

 MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalarInstance')

 # export our custom mib
 for mibObject in mibObjects:
       nextVar, = mibBuilder.importSymbols(mibObject.mibName,                                
       mibObject.objectType)
       instance = createVariable(MibScalarInstance,          
                                mibObject.valueFunc,                                     
                                mibObject.objectType,                                    
                                nextVar.name, (0,),                                  
                                nextVar.syntax)
      instanceDict = {str(nextVar.name) + "Instance":instance}
      mibBuilder.exportSymbols(mibObject.mibName,
                                        **instanceDict)

我只粘贴了最少量的代码。请询问是否需要更多。这不是正确的方法,那是什么?这方面有什么好的文档或帮助吗?你知道吗


Tags: nameself名称config代理contextsnmpmib
1条回答
网友
1楼 · 发布于 2024-05-20 22:04:58

本质上,您应该有一个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的末尾。你知道吗

这是一个很有希望操作的example script。你知道吗

除了从头开始实现您自己的SNMP代理之外,您还可以考虑试用基于相同技术的SNMP Command Responder工具,但要使它更容易(希望如此)。你知道吗

相关问题 更多 >