下面我就给您详细讲解一下“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设备上的信息。如果存在错误,将在errorIndication
或errorStatus
参数中得到错误信息。如果没有错误,则对结果进行循环操作并输出。
相同的目标也可以通过以下代码实现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-MIB
和IF-MIB
来获取有关VLAN ID、名称和端口信息的数据。可以根据需要进行更改,并将结果打印出来。
这就是“Python pysnmp使用方法及代码实例”的完整攻略。希望对您有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python pysnmp使用方法及代码实例 - Python技术站