在使用 Python 3.4 版本的 PYSNMP 库时,用户在尝试使用 setCmd()
方法设置 ifAlias
值时遇到了问题。
def SNMP_SET_IFALIAS(ifAlias):
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.setCmd(
cmdgen.CommunityData('private'),
cmdgen.UdpTransportTarget(('10.101.0.221', 161)),
(cmdgen.MibVariable('1.3.6.1.2.1.31.1.1.1.18.1'), ifAlias),
lookupValues=False,
lookupNames=False
)
当运行此代码时,用户收到了以下错误消息:
Traceback (most recent call last):
File "<pyshell#632>", line 1, in <module>
SNMP_SET_IFALIAS('Check this out')
File "<pyshell#629>", line 2, in SNMP_SET_IFALIAS
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.setCmd(cmdgen.CommunityData('private'),cmdgen.UdpTransportTarget(('10.101.0.221', 161)),(cmdgen.MibVariable('1.3.6.1.2.1.31.1.1.1.18.1'), ifAlias),lookupValues=False, lookupNames=False)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 452, in setCmd
kwargs.get('contextName', null)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 314, in setCmd
self.makeVarBinds(varBinds),
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pysnmp/entity/rfc3413/oneliner/cmdgen.py", line 212, in makeVarBinds
varVal = varName.getMibNode().getSyntax().clone(varVal)
AttributeError: 'MibIdentifier' object has no attribute ‘getSyntax'
2. 解决方案
解决此问题的关键在于加载相应的 MIB 文件,以便 PYSNMP 能够正确解析和设置 ifAlias
值。有两种方法可以加载 MIB 文件。
方法 1:显式加载 MIB 文件
from pysnmp.smi.rfc1902 import ObjectIdentity
mib_name = 'IF-MIB'
mib_module = ObjectIdentity(mib_name)
mib_path = '/path/to/IF-MIB.py'
mib_module.loadMibs(mib_path)
方法 2:使用 MIB::object.index 语法
ifAlias_oid = 'IF-MIB::ifAlias.1'
var_bind = (ifAlias_oid, 'New Alias Value')
修改后的代码如下:
def SNMP_SET_IFALIAS(ifAlias):
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.setCmd(
cmdgen.CommunityData('private'),
cmdgen.UdpTransportTarget(('10.101.0.221', 161)),
(cmdgen.MibVariable('IF-MIB::ifAlias.1'), ifAlias),
lookupValues=False,
lookupNames=False
)
现在,您可以顺利地使用 PYSNMP 库设置 ifAlias
值了。
其他问题
- 安装 pysnmp 4.2.6.2 时遇到错误
错误信息为:
Could not find a version that satisfies the requirement pyasn1>=0.1.8
(from pysnmp) (from versions: 0.0.9a0, 0.0.10a0, 0.0.11a0, 0.0.12a0,
0.0.13a0, 0.0.13b0, 0.0.13, 0.1.1, 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7) No matching distribution found for pyasn1>=0.1.8 (from pysnmp)
解决方法:
手动安装 pyasn1 库,可以使用以下命令:
pip install pyasn1==0.1.8
- 关于
lookupValues
和lookupNames
参数的理解
lookupValues
和 lookupNames
参数用于指定是否在设置值之前查找 MIB 对象。
lookupValues=False
:表示不查找 MIB 对象,直接使用提供的字符串值。lookupNames=False
:表示不查找 MIB 对象的名称,直接使用提供的 OID。
在某些情况下,可能需要同时设置 lookupValues
和 lookupNames
为 False
,以便直接访问 OID 而无需加载 MIB 文件。