使用python3+snmp协议收集信息

.【前言】

人生苦短我用python

在一些特殊场景,我们突然需要收集大量的计算机&服务器的信息,一个一个的查找c+v?

显然不是个明智的选中,这就需要使用的一个简单网络管理协议snmp,使用命令来查看服务器的信息,当然命令虽然比较快,但也是顶不住量大呀,几十台忍忍就过去了,可是有几百上千台服务器需要收集信息呢?这就需要使用到办公自动化王者“python”

1.需要一台计算机&服务器安装一下snmp服务端,

使用yum安装

yum install -y net-snmp net-snmp-utils

安装好后就输入 snmpd -v

显示正常就可以正常使用了

 2.使用yum 安装python3 

安装好后输入python3 -v 检查

3.测试snmp命令是否可用(这条命令是输出网卡的信息)

snmpwalk -v 2c -c public localhost if

 需要其他的信息需要查询oid表 把if替换为其他oid即可

4.我的需求是要查找网卡,ip地址及mac信息,以及启用状态我的python 是这样写的

import os
import json
import time


path = "./"
with open(path + 'data.json','r',encoding = 'utf-8') as fp: 
    ipdata = json.load(fp)
    fp.close()

rate = ".iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry"  #网卡
rate2 = "1.3.6.1.2.1.4.20.1.2"      #ip
community = "public"   # 这个是团体字


def formattxtf(data1):
    # 处理网卡信息
    result_device = data1.split("\n") 
    network = len(data1.split("ifIndex"))-1
    addlist = []
    for i in range(network):
        a = []
        addlist.append(a)
    for a in range(network):
        i=a
        while i < len(result_device)-1:
            formattext = result_device[i].split(": ")[-1]
            addlist[a].append(formattext)
            i += network
    return addlist

def formattxtel(data2):
    # 处理ip信息
    iplist = data2.split("\n")
    networknb = len(iplist)-1
    ipaddlist = []
    for i in range(networknb):
        a = []
        ipaddlist.append(a)
    for i in range(len(iplist)-1):
        ips = iplist[i].split("ipAdEntIfIndex.")[1].split("= ")[0]
        # 拿到ip
        ids = iplist[i].split(": ")[-1]
        ipaddlist[i].append(ips)
        ipaddlist[i].append(ids)
    return ipaddlist

def loadlist(addlist,ipaddlist):
    loadlist = []
    for i in range(len(ipaddlist)):
        ipid  = ipaddlist[i][1]
        for x in range(len(addlist)):
            if ipid == addlist[x][0]:
                if addlist[x][5] != '':
                    loadip = ipaddlist[i][0]
                    loadname = addlist[x][1]
                    loadspeed = str(int(addlist[x][4])/1000000) + "Mbps"
                    loadmac = addlist[x][5]
                    loadstatus = addlist[x][6].split("(")[0]
                    datas = {
                        "ip":loadip,
                        "name":loadname,
                        "speed":loadspeed,
                        "mac":loadmac,
                        "status":loadstatus
                    }
                    loadlist.append(datas)
    return loadlist
        

# bash1 = "snmpwalk -v 2c -c {} {} {}".format(community, ip, rate)
# bash2 = "snmpwalk -v 2c -c {} {} {}".format(community, ip, rate2)

# addlist = formattxtf(data1) #网卡
# ipaddlist = formattxtel(data2) #ip
# print(loadlist(addlist,ipaddlist)) #测试输出
listall = []
for i in range(len(ipdata)):
    ip = ipdata[i]['ip']
    bash1 = "snmpwalk -v 2c -c {} {} {}".format(community, ip, rate)
    data1 = result_device = os.popen(bash1).read()
    bash2 = "snmpwalk -v 2c -c {} {} {}".format(community, ip, rate2)
    data2 = result_device = os.popen(bash2).read()
    addlist = formattxtf(data1) #网卡
    ipaddlist = formattxtel(data2) #ip
    listall.append(loadlist(addlist,ipaddlist))

print(listall)

file_name = 'number.json' #通过扩展名指定文件存储的数据为json格式
with open(file_name,'w') as file_object:
    json.dump(listall,file_object)

6.当然我的ip列表都放在了data.json里面了

[
    {
        "ip":"127.0.0.1",
        "name":"vahoat1"
    },
    {
        "ip":"localhost",
        "name":"vahoat2"
    },
    {
        "ip":"127.0.0.1",
        "name":"vahoat2"
    },
    {
        "ip":"127.0.0.1",
        "name":"vahoat2"
    }

]

7.一个对象是一个地址,当然我没使用到name可以不写name

执行这python文件会生成一个number.json 的文件还需要一个工具来进行转换从excel文件方便查看

8.转换工具,如果收集的是其他信息做简单修改即可复用

import json
import xlsxwriter as xw

path = "./"
with open(path + 'test.json','r',encoding = 'utf-8') as fp: 
    ipdata = json.load(fp)
    fp.close()

def xw_toExcel(data, fileName):  # xlsxwriter库储存数据到excel
    workbook = xw.Workbook(fileName)  # 创建工作簿
    worksheet1 = workbook.add_worksheet("sheet1")  # 创建子表
    worksheet1.activate()  # 激活表
    title = ['ip', '名字', '速度','mac','状态']  # 设置表头
    worksheet1.write_row('A1', title)  # 从A1单元格开始写入表头
    i = 2  # 从第二行开始写入数据
    for j in range(len(data)):
        insertData = [data[j]["ip"], data[j]["name"], data[j]["speed"],data[j]["mac"],data[j]["status"]]
        row = 'A' + str(i)
        worksheet1.write_row(row, insertData)
        i += 1
    workbook.close()  # 关闭表


testobj = []
for i in range(len(ipdata)):
    for x in range(len(ipdata[i])):
        testobj.append(ipdata[i][x])

fileName = '测试.xlsx'
xw_toExcel(testobj, fileName)

9,最终的效果execl

 当然可能只有我需要收集网络信息,你也可以收集cpu,内存,挂载目录,安装软件,磁盘容量等等数据,替换oid即可,

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值