应用netsnmp-python库进行开发

应用netsnmp-python库进行开发

  • 一、SNMP介绍
  • 二、netsnmp优势-相对于pysnmp
  • 三、OID和MIB介绍
  • 四、netsnmp-python库开发
    • 1、通过类的方法进行Get:
    • 2、以下是通过类的方法进行set:
  • 五、python并发获取snmp信息说明

一、SNMP介绍

SNMP(简单网络管理协议)是一个应用协议,用来管理网络上的节点,(包括工作站,路由器,交换机,集线器和其他的外围设备)。网络管理系统发出一个请求,被管理设备返回响应。这些行为由四种协议操作组成:Get,GetNext,Set 和Trap。Get操作获取OID(对象标识符)对应的信息。如果get不到对应的值,则不返回任何信息。GetNext操作是用来从agent表中获取表中下一个信息。Set操作是用来设置(更新)agent信息。trap操作用于agent向NMS通告有意义的事件,例如让设备周期性地反馈内存使用情况。

共定义了三个SNMP版本:
SNMPv1:是SNMP协议的最初版本,提供最小限度的网络管理功能( 读、写MIB功能),存在较多安全缺陷。
SNMPv2c:增加批量数据的获取(GetBulk操作),inform报文在发出报文之后能收到响应报文,仍使用团体字community。 (常用该版本)
SNMPv3:主要在安全性方面进行了增强,USM技术提供了认证和加密功能,VACM技术确定用户是否允许访问特定的MIB对 象以及访问方式。

二、netsnmp优势-相对于pysnmp

Pysnmp是一个纯python的snmp模块,pysnmp强在mib解析等方面,性能方面不能和netsnmp媲美,所以这里推荐使用netsnmp。

三、OID和MIB介绍

OID(对象标识符),是SNMP代理提供的具有唯一标识的键值,它是按照树状结构中的唯一地址来表示如下图所示。
应用netsnmp-python库进行开发_第1张图片
使用OID能够访问系统中所需要的对象,获取或设置对象信息,例如通过‘.1.3.6.1.2.1.2.2.1.6’,获取设备接口的物理地址。SNMP协议OID支持标准库和私库,所谓的标准库是所有SNMP自带的OID库,而私库则是由不同的厂商提供自己的设备OID信息,可通过厂商提供的MIB文件查找需要的OID值。
MIB(管理信息基)提供数字化OID到可读文本的映射,例如OID‘.1.3.6.1.2.1.1.2’映射为文本‘sysObjectID’。推荐使用“MIB Browser”软件查看MIB文件,这样更方便查询各OID的对应的功能。

四、netsnmp-python库开发

注意类和函数的方式的区别。类方法始终要求传入的参数为oid列表,函数的方式则可以把单个或者多个oid作为参数传入,不需要oid列表。但是函数的方式其实是在调用类方法,为此,可能效率要比类方法低,所以采用类的方法更加合适。

1、通过类的方法进行Get:

例子如下:
import netsnmp
session = netsnmp.Session(Version=2,DestHost=‘200.201.128.81’,Community=‘public’)
oid1 = netsnmp.Varbind(‘1.3.6.1.4.1’,‘2544.1.12.2.1.10.1.0’,2,‘INTEGER’)
oid2 = netsnmp.Varbind(‘1.3.6.1.4.1.318.1.1.1.4.1.1’,‘1.1.1.1’,20,‘INTEGER’)
oidList = netsnmp.VarList(oid1,oid2)
resultList = session.get(oidList)
print resultList

2、以下是通过类的方法进行set:

session = netsnmp.Session(Version=2,DestHost=‘200.201.128.81’,Community=‘private’)
oid1 = netsnmp.Varbind(‘1.3.6.1.4.1’,‘2544.1.12.2.1.10.1.0’,2,‘INTEGER’)
oid2 = netsnmp.Varbind(’.1.3.6.1.4.1.2544.1.12.8.1.1.1.5’,‘1.1.1.1’,20,‘INTEGER’)
oidList = netsnmp.VarList(oid1,oid2)
resultList = session.set(oidList)
print resultList

类实例化说明:

netsnmp.Session(Version=2, DestHost=host, Community=community, Timeout=500000, Retries=1)

	Session方法:建立会话
	Version:协议版本选择,默认使用SNMPv3,对应的版本为SNMPv1:1,SNMPv2:2,SNMPv3:3
	DestHost:目标IP
	Community:团体字,类似目标读/写密码,默认‘public’
	Timeout:超时设置(单位:微秒),netsnmp5.7.3默认500000微秒
	Retries:重试读/写次数

netsnmp.Varbind(self, tag=None, iid=None, val=None, type=None):

	Varbind方法:表示要获取或设置的单个MIB对象,可以绑定变量名(ifIndex) 或 唯一标识符(.1.3.6.1.2.1.2.2.1.1),也可	以组合使用
	tag:共有三种形式:
		①tag值可以是“叶”标识符,例如‘1.3.6.1.4.1’
		②直接使用对象标识符OID,例如'1.3.6.1.4.1.318.1.1.1.4.1.1'
		③限定标识符:例如 '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr'
	iid:点十进制标识符,比如‘1.1.1.1’
	val:设置SNMP数据值,对于集合操作,必须保证格式规范,规范如下
				OBJECTID => 点分十进制 (例如.1.3.6.1.2.1.1.1)
				OCTETSTR => 8字节数perl标量,
				INTEGER => 十进制带符号整数,
				NETADDR => 点分十进制,
				IPADDR => 点分十进制,
				COUNTER => 计数器,十进制无符号整数,
				COUNTER64 => 计数器,十进制无符号整数,
				GAUGE, => 十进制无符号整数,
				UINTEGER, => 十进制无符号整数,
				TICKS, => 十进制无符号整数,
				OPAQUE => 8字节数perl标量,
				NULL, => 8字节数perl标量,
	type:表示类型,参数列表如上,该字段由'get'和'getnext'操作填充,如果在MIB解析文件中描述了该属性,则不用填写该字段。对于'set'操作,如果使用数值OID对象不在已解析的MIB中,必须提供该字段

netsnmp.VarList(oid_list):

	VarList可以绑定多个变量
	VarList中有一个变量错误,则List全部错误

五、python并发获取snmp信息说明

在并发获取多台机器的时候,不能够使用协程获取,因为使用协程,在get数据的时候,协程会一直等待net-snmp接口返回数据,从这点上来说,使用协程和串行获取没有区别。
我们可以使用多线程获取(当然也可以使用多进程)。多个线程同时调用net-snmp的接口获取数据,当一个线程获取一个结果后,可以继续调用接口获取下一个snmp数据。
注:python多线程使用这里不做介绍,可参考https://www.jb51.net/article/109585.htm

如果有用别忘记点赞哦,谢谢!!!

你可能感兴趣的:(#,网络协议,基础知识,netsnmp,python,OID,MIB)