.【前言】
人生苦短我用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即可,