Python3 三方包 easysnmp 报错 Error: unknown object id (IF-MIB::ifDescr) 解决思路和解决方案

news/2024/11/17 16:21:26/

背景介绍

由于历史原因公司遗留了很多老旧设备,这些设备有很多的是 H3C 的 58 系列,这些老设备有的不支持 Netconf,所以在做 SDN 的时候只能判断多种情况来适配这些老旧设备。

华为新设备和 H3C 的 68 系列都用 Netconf 下发配置,如果是 H3C 的 58 系列或者其他老旧设备则用分为两种情况:设备配置用 SNMP设备配置用 SSH

# 匹配设备和型号对应的适配器
if agent_name == 'h3c':if model_name in ['S5800-60C-PWR', 'S5820X-26S', 'S5820-32F']:  # V5if model == 'read':device_params['ssh_password'] = device_snmpreturn SNMPDevice(**device_params)elif model == 'write':return SSHDevice(**device_params)else:raise ValueError('不支持该操作!')elif model_name in ['S6800-2C', 'S6800-4C', 'S10506X', 'S10506', 'S6800-54QF']:  # V7device_params['ssh_port'] = 830return NetconfDevice(**device_params)else:raise ValueError('不支持该设备!')
else:raise ValueError('不支持该厂商!')

出现问题

但是最近 58 系列设备的读功能(SNMP)出现了问题。

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-from easysnmp import snmp_walkdef main(oid):cursor = snmp_walk(oids=oid,hostname='xxx.xxx.xxx.xxx',community='xxx',version=2,use_sprint_value=True)print(cursor)if __name__ == '__main__':snmp_oid = 'IF-MIB::ifDescr'main(snmp_oid)

在这里插入图片描述

解决思路和解决方案

第一回合

报错的意思是找不到对应对象的 oid,但是本地 MIB库 是没问题的。

MacBook:~ zhangyi$ snmpwalk -v 2c -c xxx xxx.xxx.xxx.xxx IF-MIB::ifDescr
IF-MIB::ifDescr.1 = STRING: GigabitEthernet1/0/1
IF-MIB::ifDescr.2 = STRING: GigabitEthernet1/0/2
IF-MIB::ifDescr.3 = STRING: GigabitEthernet1/0/3
IF-MIB::ifDescr.4 = STRING: GigabitEthernet1/0/4
IF-MIB::ifDescr.5 = STRING: GigabitEthernet1/0/5
IF-MIB::ifDescr.6 = STRING: GigabitEthernet1/0/6
IF-MIB::ifDescr.7 = STRING: GigabitEthernet1/0/7
IF-MIB::ifDescr.8 = STRING: GigabitEthernet1/0/8
IF-MIB::ifDescr.9 = STRING: GigabitEthernet1/0/9
IF-MIB::ifDescr.10 = STRING: GigabitEthernet1/0/10
......

所以大概是因为 IF-MIB::ifDescr 这个字符串用不了了,当我把它换成具体的 oid 号时是不报错了,但是返回的 oid_index 也没有了值。

if __name__ == '__main__':snmp_oid = '1.3.6.1.2.1.2.2.1.2'main(snmp_oid)

在这里插入图片描述
所以这个问题不是 IF-MIB::ifDescr 导致的。

第二回合

接下来就是从 easysnmp 这个 Python 包中找问题了,easysnmp 底层是调用的是 net-snmp 这个系统级包,所以先查询下 net-snmp 在本机上的版本。

snmpget --version
NET-SNMP version: 5.6.2.1

当我打开官网看到 net-snmp 最新版本是 5.9.1 的时候就怀疑是不是旧版本导致的问题,所以决定先升级试试。
在这里插入图片描述

我本机系统是 Mac OS X,所以使用 brew 安装很方便。

brew install net-snmp

但是当我装好最新本版以后发现系统版本还是原来的 5.6.2.1

原因是我本机有多个版本,解决方法有两种:一种是删除旧版本,另一种是将新版本加到环境变量中。旧版本建议别删除万一系统中哪个应用用到呢,所以我们选择添加环境变量。

打开 ~/.bashrc 文件:

vi ~/.bashrc

添加到环境变量:

export PATH=/usr/local/Cellar/net-snmp/5.9.3/bin/:$PATH

重新打开终端这时就改成新版本了:

snmpget -V
NET-SNMP version: 5.9.3

但是结果很失望,还是不行!

第三回合

既然不是底层 net-snmp 的问题难道是 easysnmp 这个包的问题吗?

重新版本后发现确实比之前的版本高一点。

pip list | grep easysnmp
easysnmp  0.2.6

之前用的版本是 0.2.5,现在最新的是 0.2.6

但按道理说应该新版本会向下兼容的,为了打消疑虑决定将版本回退到 0.2.5
在这里插入图片描述
当我把版本降到 0.2.5 之后一切都正常了!

我:@#$^&%!$# ……*&%¥&@34%#!!!

总结

最后总结下经验教训吧,虽然最后查到的问题只是个版本的问题,但是为了解决这个问题前前后后浪费了大半天的时间也是郁闷。

这也说明在软件开发过程中,任何细节都不能放过,那些我们认为理所当然的事(版本应该向下兼容)也有可能出“黑天鹅”事件。所以在以后的开发中第三方包也应该在考虑范围之内,当时开发的包是什么版本就强制指定,即使在后续需要升级也要在版本改动后进行大量测试!


http://www.ppmy.cn/news/38544.html

相关文章

day05_流程控制语句

今日内容 零、 复习昨日 一、作业 二、键盘录入 三、流程控制语句 零、 复习昨日 赋值运算 号的功能 相加 拼接 / 号的特殊情况 除法,整数相除除不尽取整 % 号的应用场景 取余,判断奇偶性 int a 1; int b a; // 如何解释,先把a赋值给b,然后a自增1 int c a; // 如何解释,a先…

开心档之C++ 多态

目录 C 多态 实例 虚函数 纯虚函数 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 下面的实例中&#x…

tftp与ftp的异同

tftp与ftp的异同 TFTP(Trivial File Transfer Protocol)和FTP(File Transfer Protocol)都是用于文件传输的协议,但是它们有一些不同之处。 异同点: 功能:FTP提供了比TFTP更多的功能&#xff…

Envoy:httpfilter相关代码阅读

本篇文章是envoy httpfilter相关代码阅读的整理和总结,笔者试图通过这篇文章将http filter在envoy内部的管控讲清楚,并且将request和response是如何使用这部分 http filter功能的流程介绍清楚。httpfilter是netfilter中的一种filter,因为envo…

[Linux]环境变量

一.什么是环境变量 为了满足不同的运行场景,操作系统预先设置了一大批全局变量,这种可以指定操作系统运行环境的变量就是环境变量。 我们平常使用的指令本质上也是用C语言实现的一个个小程序,但是我们在执行我们自己的可执行程序时往往是类…

Vue路由

vue路由 文章目录vue路由1.vue-router简单使用1.1vue-router的下载1.2在main.js1.3router的配置1.4 路由的切换1.5路由指定位置的显示2.嵌套路由2.1 多级路由的配置2.2 多级路由的query传参2.3 多级路由的params传参2.4 接受路由的props参数2.编程试路由2.1 按钮的跳转2.2页面的…

ptrace注入游戏介绍

Android系统采用的是Linux内核,很多Linux系统上的技术都可以应用在Android系统上,Android系统上ptrace注入远程进程的技术就是其中一种。本章节将对ptrace注入的完整流程进行介绍。 一、ptrace函数介绍 ptrace注入技术的核心就是ptrace函数&#xff0c…

云计算基础——云存储技术简介

云存储的种类及其合适的应用 可以把云存储分成块存储与文件存储两类。 块存储 快速更改的单一文件系统针对单一文件大量写的高性能计算(HPC) 文件存储 文件及内容搜寻Tier-2 NAS多文件大量写入的应用数据大量读写的应用多个使用端都希望读取同一个文…