Python3用EasySNMP查SNMP部分交换机超时,bash命令正常
排查EasySNMP查询Switch_B超时问题的步骤
1. 校验SNMPv3引擎ID匹配情况
部分SNMPv3设备会严格校验客户端引擎ID,bash的snmpget可能自动适配或缓存了目标设备的引擎ID,但EasySNMP默认可能使用固定值。可以先通过snmpget获取Switch_B的引擎ID:
snmpget -v3 -l authPriv -u userA -a MD5 -A auth_pass -x DES -X priv_pass Switch_B.example.com SNMP-FRAMEWORK-MIB::snmpEngineID.0
再手动指定引擎ID测试EasySNMP请求:
easysnmp.snmp_get( ['sysDescr.0'], hostname='Switch_B.example.com', security_username='userA', auth_protocol='MD5', auth_password='auth_pass', version=3, security_level='auth_with_privacy', privacy_password='priv_pass', privacy_protocol='DES', engine_id='获取到的Switch_B引擎ID' )
2. 调整超时与重试参数
EasySNMP默认超时时间可能比snmpget短,尝试增大超时窗口和重试次数:
easysnmp.snmp_get( ['sysDescr.0'], hostname='Switch_B.example.com', security_username='userA', auth_protocol='MD5', auth_password='auth_pass', version=3, security_level='auth_with_privacy', privacy_password='priv_pass', privacy_protocol='DES', timeout=10, # 单位:秒,默认通常为2 retries=3 # 默认重试次数通常为1 )
3. 排查网络层面差异
- 确认Switch_B是否限制了SNMP响应的源端口:
snmpget和EasySNMP使用的源端口可能不同,检查设备是否仅允许特定源端口的请求 - 抓包对比两种请求的差异:用
tcpdump抓取snmpget和EasySNMP的请求包,查看SNMPv3字段(如msgID、安全参数)是否存在格式差异tcpdump -i any host Switch_B.example.com and udp port 161
4. 适配设备的SNMPv3协议细节
部分设备对SNMPv3字段格式敏感,可尝试以下调整:
- 将协议参数改为小写:
auth_protocol='md5'、privacy_protocol='des' - 明确指定上下文名称(若设备配置了特定上下文):
e asysnmp.snmp_get( ['sysDescr.0'], hostname='Switch_B.example.com', security_username='userA', auth_protocol='MD5', auth_password='auth_pass', version=3, security_level='auth_with_privacy', privacy_password='priv_pass', privacy_protocol='DES', context_name='设备配置的上下文名称' )
5. 验证EasySNMP的底层依赖兼容性
EasySNMP依赖net-snmp库,确认本地snmpget使用的net-snmp版本与EasySNMP绑定的版本一致;若不一致,尝试重新编译安装EasySNMP,确保与系统net-snmp库兼容。
内容的提问来源于stack exchange,提问作者7th Sin
相关产品推荐
相关产品推荐

