Python pysnmp使用方法及代码实例

yizhihongxing

下面我就给您详细讲解一下“Python pysnmp使用方法及代码实例”的完整攻略。

什么是pysnmp

pysnmp是基于Python的SNMP开发工具,可以用于快速在Python中编写SNMP管理应用程序,并支持IPv4和IPv6。pysnmp是一种高级的网络管理协议,其提供了一个简单的API来实现SNMP 键值对的信息读取,我们可以非常简单的实现SNMP数据的获取。

安装pysnmp

在开始之前,需要先安装pysnmp模块。可以在终端或命令行中输入以下命令进行安装:

pip install pysnmp

pysnmp的使用方法

pysnmp包含了SNMP的五个协议数据单元(PDU)类型:

  • GetRequest
  • GetNextRequest
  • GetResponse
  • SetRequest
  • Trap

可以使用以下Python代码实现SNMP的get请求示例:

from pysnmp.hlapi import *

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData('public', mpModel=0),
           UdpTransportTarget(('demo.snmplabs.com', 161)),
           ContextData(),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
)

if errorIndication:
    print(errorIndication)
elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex)-1][0] or '?'))
else:
    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

以上代码获取了SNMPv2-MIB的sysDescr信息。首先我们通过getCmd函数获取了一个生成器,然后使用该生成器获取了SNMP设备上的信息。如果存在错误,将在errorIndicationerrorStatus参数中得到错误信息。如果没有错误,则对结果进行循环操作并输出。

相同的目标也可以通过以下代码实现SNMP的set请求:

from pysnmp.hlapi import *

errorIndication, errorStatus, errorIndex, varBinds = next(
    setCmd(SnmpEngine(),
           CommunityData('private', mpModel=0),
           UdpTransportTarget(('demo.snmplabs.com', 161)),
           ContextData(),
           ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysContact', 0), 'Testing SNMPv2-MIB::sysContact has been set')
          )
)

if errorIndication:
    print(errorIndication)
elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex)-1][0] or '?'))
else:
    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

以上代码设置SNMPv2-MIB的sysContact信息。可以看到我们使用了setCmd函数和ObjectType类来设置给定OID条目的值。

pysnmp的代码实例

下面我们来看一个简单的实例。我们将连接到一个SNMP设备并获取CPU利用率。首先我们使用以下代码连接到SNMP设备:

from pysnmp.hlapi import *

errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData('public', mpModel=0),
           UdpTransportTarget(('demo.snmplabs.com', 161)),
           ContextData(),
           ObjectType(ObjectIdentity('UCD-SNMP-MIB', 'ssCpuUser', 0)))
)

然后我们打印结果:

if errorIndication:
    print(errorIndication)
elif errorStatus:
    print('%s at %s' % (errorStatus.prettyPrint(),
                        errorIndex and varBinds[int(errorIndex)-1][0] or '?'))
else:
    for varBind in varBinds:
        print(' = '.join([x.prettyPrint() for x in varBind]))

以上代码将获取SSCPUUser MIB的信息,并按照OID 1.3.6.1.4.1.2021.11.50来获取CPU利用率。

另一个实例,我们将使用SNMP连接到Cisco交换机并获取VLAN ID和名称匹配的端口信息。以下是代码示例:

from pysnmp.hlapi import *

vlan_id = 100
vlan_name = 'VLAN100'

for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd(
        SnmpEngine(),
        CommunityData('public', mpModel=0),
        UdpTransportTarget(('192.168.1.1', 161)),
        ContextData(),
        ObjectType(ObjectIdentity('VLAN-MIB', 'vlanName')),
        ObjectType(ObjectIdentity('VLAN-MIB', 'dot1qVlanStaticUntaggedPorts')),
        ObjectType(ObjectIdentity('VLAN-MIB', 'dot1qVlanStaticEgressPorts')),
        ObjectType(ObjectIdentity('VLAN-MIB', 'dot1qVlanFdbId')),
    ):
    if errorIndication:
        print(errorIndication)
        break
    else:
        if errorStatus:
            print('%s at %s' % (errorStatus.prettyPrint(),
                                errorIndex and varBind[int(errorIndex)-1][0] or '?'))
        else:
            for varBind in varBinds:
                oid = varBind[0]
                value = varBind[1]
                if str(oid).startswith('1.3.6.1.4.1.9.9.68.1.2') and str(value) == str(vlan_id):
                    vlan_index = str(oid).split('.')[-1]
                    vlan_name_oid = ObjectType(ObjectIdentity('VLAN-MIB', 'vlanName', vlan_index))
                    vlan_name = next(getCmd(SnmpEngine(), CommunityData('public'), UdpTransportTarget(('192.168.1.1', 161)), vlan_name_oid))[3][0][1].prettyPrint()
                elif str(oid).startswith('1.3.6.1.4.1.9.9.46.1.6.1.1') and str(value) == str(vlan_id):
                    port_index = str(oid).split('.')[-1]
                    port_oid = ObjectType(ObjectIdentity('IF-MIB', 'ifName', port_index))
                    port_name = next(getCmd(SnmpEngine(), CommunityData('public'), UdpTransportTarget(('192.168.1.1', 161)), port_oid))[3][0][1].prettyPrint()
                    print('Port %s is in VLAN %s (%s)' % (port_name, vlan_id, vlan_name))

以上代码中,我们使用了VLAN-MIBIF-MIB来获取有关VLAN ID、名称和端口信息的数据。可以根据需要进行更改,并将结果打印出来。

这就是“Python pysnmp使用方法及代码实例”的完整攻略。希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python pysnmp使用方法及代码实例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 简单的Python人脸识别系统

    简单的Python人脸识别系统 概述 Python人脸识别系统一般由以下几个模块构成: 摄像头模块:通过电脑或者外接摄像头采集照片或者视频 人脸检测模块:使用人脸检测算法从采集的照片或者视频中提取人脸图像 人脸特征提取与比对模块:对于每个人,在系统中维护一个特征向量用于表示一个人的特征,新采集到的人脸图像与系统中维护的人脸特征向量进行比对,判断是否为同一人 …

    python 2023年5月18日
    00
  • 编写同时兼容Python2.x与Python3.x版本的代码的几个示例

    编写既兼容Python2.x又兼容Python3.x的代码需要遵循以下几个规则: 使用print()函数代替print语句 在Python 2.x中,print是一个语句而非函数,因此可以直接使用print “Hello World!”这种形式输出。在Python 3.x中,print变成了一个函数,因此必须使用print(“Hello World!”)这种…

    python 2023年6月3日
    00
  • 一篇文章带你了解python正则表达式的正确用法

    一篇文章带你了解Python正则表达式的正确用法 正则表达式是一种用于描述字符串模式的语言,可以用匹配、查找、替换和割字符串。Python中的re模块提供了正则表达式支持,方便进行字符串的处理。本文将详细讲解Python正则表达式使用,包括正则表达式语法、re模块的常用函数以及两个用匹配实例。 正则表达式语法 正则表达式由一些特殊字符和普通字符组成,用于字符…

    python 2023年5月14日
    00
  • python爬取各类文档方法归类汇总

    python爬取各类文档方法归类汇总 在Python中,我们可以使用多种方式爬取各类文档,包括但不限于html、pdf、doc等格式的文档。下面将对几种常用的爬取方法进行介绍。 爬取HTML文档 在Python中,我们可以使用requests库和BeautifulSoup库来爬取HTML文档。其中,requests库用于发送请求并获得响应,而Beautifu…

    python 2023年5月14日
    00
  • python中将\\uxxxx转换为Unicode字符串的方法

    在Python中,可以使用unicode_escape编解码器将\uxxxx表示的Unicode字符序列转换为Unicode字符串。下面是具体步骤: 定义一个包含\uxxxx表示的Unicode字符序列的字符串 例如,我们有一个字符串”\u4e2d\u6587″,表示中文两个字。这个字符串实际上是两个Unicode字符,分别对应中文的“中”和“文”。 使用u…

    python 2023年5月20日
    00
  • conda虚拟环境使用pip下载包到当前环境的两种方法

    当使用Anaconda或Miniconda创建虚拟环境时,在虚拟环境中使用pip下载Python库的时候,可能会遇到两种问题: 安装的库版本与已有的版本冲突 无法在虚拟环境中找到pip 下面是两种常用的conda虚拟环境使用pip下载包的方法: 方法一:使用conda代替pip安装包 这种方法是使用conda代替pip安装Python库,以避免与已有版本产生…

    python 2023年5月14日
    00
  • Python starmap()和map()应用数据

    Python中的starmap和map函数都可以应用于数据处理和转换,两个函数的作用很类似,都可以对序列中的每个元素应用一个函数进行转换,区别在于传入函数的参数不同。下面分别详细讲解: map() map()函数可以接受一个函数和一个或多个序列,将序列中每个元素应用函数处理,返回所有处理结果组成的列表。例如: def square(n): return n*…

    python-answer 2023年3月25日
    00
  • 使用pyscript在网页中撰写Python程式的方法

    当然,我很乐意为您提供“使用pyscript在网页中撰写Python程式的方法”的完整攻略。以下是详细步骤和示例。 使用pyscript在网页中撰写Python程式的方法 pyscript是一种在网页中撰写Python程式的方法,它可以让用户在网页中直接编写Python代码,并且可以实时运行和试代码。以下是使用pyscript在网页中撰写Python程式的完…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部