如何用Python实现带认证无加密的SNMPv3?pysnmp访问CISCO 2960报错
解决SNMPv3带认证无加密(pysnmp+Cisco 2960)的问题
错误原因分析
你遇到的MibNotFoundError是因为pysnmp默认缺少部分MIB文件,即使你请求的是SNMPv2-MIB::sysName,库在解析时可能依赖关联的IF-MIB,而该MIB未安装。
步骤1:安装缺失的MIB包
执行命令安装官方维护的pysnmp MIB集合:
pip install pysnmp-mibs
步骤2:修正SNMPv3认证配置
你的代码指定了加密协议但未提供加密密钥,不符合带认证无加密的需求。正确配置应仅保留认证相关参数:
修正后的代码:
from pysnmp.hlapi import UsmUserData, usmHMACSHAAuthProtocol from pysnmp.hlapi import SnmpEngine, UdpTransportTarget, ContextData, ObjectType, ObjectIdentity, getCmd # 替换为你的实际参数 snmpName = "your_snmp_username" snmpPass = "your_auth_password" ipHost = "switch_ip_address" # 仅配置认证,不设置加密参数 auth = UsmUserData( userName=snmpName, authKey=snmpPass, authProtocol=usmHMACSHAAuthProtocol ) # 执行SNMP GET请求 data = getCmd( SnmpEngine(), auth, UdpTransportTarget((ipHost, 161)), ContextData(), ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0)) ) errorIndication, errorStatus, errorIndex, varBinds = next(data) if errorIndication: print(f"错误提示: {errorIndication}") elif errorStatus: print(f"错误状态: {errorStatus.prettyPrint()} at {varBinds[int(errorIndex)-1] if errorIndex else '?'}") else: for varBind in varBinds: print(f"{varBind[0].prettyPrint()} = {varBind[1].prettyPrint()}")
额外检查项
- 确认Cisco 2960已配置SNMPv3用户:启用SHA认证、关闭加密,且用户拥有读取sysName等OID的权限。
- 验证交换机与代码运行主机之间网络可达,UDP 161端口未被防火墙拦截。
内容的提问来源于stack exchange,提问作者Alchimie
相关产品推荐
相关产品推荐

