Python中存在一个库:pysnmp,封装了与SNMP协议相关的操作。
本文对pysnmp做一个简单的、流于表面的实践,对其细节暂不作解释。
首先需要安装pysnmp:
pip pysnmp
在使用它的时候,导入这个库:
from pysnmp.hlapi import *
然后,封装一个Snmp类好了。
from pysnmp.hlapi import *
class Snmp:
def __init__(self, community='dgut'):
self.engine = SnmpEngine() # 初始化引擎
self.communityData = CommunityData(community, mpModel=1) # 配置团体字
self.context = ContextData() # 实例化上下文对象
# snmp的获取一个oid对应值的操作
@classmethod
def deal_result(cls, original_res):
original_str = str(original_res) # nextCmd()获取到的是一个对象,将其转化为字符串
processed_str = original_str.split('=')[1].strip() # = 后的内容是所需要的,顺便去除前后的空格
return processed_str
# pysnmp中封装getCmd、nextCmd、bulkCmd
# 对应SNMP中的get、getNext、getBulk操作
def get(self, host, oid, port=161):
target = UdpTransportTarget((host, port)) # 配置目标主机
req_oid = ObjectType(ObjectIdentity(oid)) # 输入需要获取的对象的oid
req_g = getCmd(self.engine, self.communityData, target, self.context, req_oid)
_, _, _, res = next(req_g)
final_res = self.deal_result(res[0])
return final_res
接下来就尝试用它来获取一个系统名称sysName。
s = Snmp()
ip = "10.1.1.254" # 你需要获取信息的设备IP地址
oid = ".1.3.6.1.2.1.1.4.0" # sysName的OID
sys_name = s.get(ip, oid)
print(sys_name)
需要注意的是,**Snmp.get()**方法只能获取单个值的节点信息,如果想要获取ipAddress之类的一组信息,还需要使用GetNext、GetBulk操作。
以获取ARP缓存表为例,写一个方法文章来源:https://www.toymoban.com/news/detail-695359.html
def get_arp_table(self, host, port=161):
target = UdpTransportTarget((host, port)) # 配置目标主机、端口
phy_address_oid = ObjectType(ObjectIdentity('.1.3.6.1.2.1.4.22.1.2'))
net_address_oid = ObjectType(ObjectIdentity('.1.3.6.1.2.1.4.22.1.3'))
g = nextCmd(self.engine, self.communityData, target, self.context,
phy_address_oid, net_address_oid, lexicographicMode=False)
arp_table = []
for errorIndication, errorStatus, errorIndex, varBinds in g:
temp = {
'ipNetToMediaPhysAddress': self.deal_result(varBinds[0]),
'ipNetToMediaNetsAddress': self.deal_result(varBinds[1])
}
arp_table.append(temp)
return arp_table
如此,一个简单的案例就完成了。文章来源地址https://www.toymoban.com/news/detail-695359.html
到了这里,关于Python通过SNMP获取设备信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!