pysnmp cmdGen-如何从变量提供OID

时间:2018-07-30 22:51:36

标签: python pysnmp

我有一个要返回的SNMP OID列表,但是我不能用该变量代替命令中的OID。我什至尝试将变量包装到一个eval中,并与ObjectType和ObjectIdentity结合在一起,但没有成功。

我已经从here那里获取了基本配置模板,并为我的目的进行了编辑。

这是完整的配置块:

cmdGen = cmdgen.CommandGenerator()
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
    cmdgen.UsmUserData(user, 
                    authKey=authKe, 
                    privKey=privKe, 
                    authProtocol=authProto, 
                    privProtocol=privProto, 
                    securityEngineId=None
            ),
    cmdgen.UdpTransportTarget((sHost, 161)),
    (_OID), 

以下所有替换代替(_OID),

    cmdgen.MibVariable('1.3.6.1.2.1.1.1.0'),
    cmdgen.MibVariable('1.3.6.1.2.1.1.6.0'),
    cmdgen.MibVariable('1.3.6.1.2.1.1.5.0'),
    cmdgen.MibVariable('1.3.6.1.2.1.1.4.0'),
    cmdgen.MibVariable(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)),
    '1.3.6.1.2.1.1.1.0', '1.3.6.1.2.1.1.4.0', '1.3.6.1.2.1.1.5.0', '1.3.6.1.2.1.1.6.0', 

以上所有内容可以单独或以任何其他组合的形式添加为完整的块。 _OID变量采用OID列表,并将其转换为如下所示的字符串:'1.3.6.1.2.1.1.1.0', '1.3.6.1.2.1.1.4.0', '1.3.6.1.2.1.1.5.0', '1.3.6.1.2.1.1.6.0',。我怀疑甚至可以直接使用该列表。

我知道我可以将getCmd封装在for中,并且,只要我事先实例化引擎,就不会对性能造成任何影响,如here所述,但是我喜欢cmdgen方法因为它很干净,我怀疑包装起来会很贵。

如何使用_OID变量动态设置所需的OID?

pysnmp版本4.4.4

1 个答案:

答案 0 :(得分:2)

如果序列中有位置参数,只需使用*运算符将它们解压缩为函数的位置参数即可。

_oids = ('1.3.6.1.2.1.1.1.0', '1.3.6.1.2.1.1.4.0',
         '1.3.6.1.2.1.1.5.0', '1.3.6.1.2.1.1.6.0')

cmdGen.getCmd(
    cmdgen.UsmUserData(
        user, 
        authKey=authKe, 
        privKey=privKe, 
        authProtocol=authProto, 
        privProtocol=privProto
    ),
    cmdgen.UdpTransportTarget((sHost, 161)),
    *[ObjectType(ObjectIdentity(oid)) for oid in _oids]
)