Python3网络设备巡检(交换机篇)

介绍

只写了交换机的,路由器、防火墙、负载等其它设备以后,有需求再写,下面以一组交换机为例。

思路

1、收取交换机的信息 
需要哪些信息,哪些命令,不同品牌交换机命令不同(本篇以H3C为例),需要提前规划好。交换机的IP、名字、密码等信息,写入数据库比较方便。 
2、把需要的信息填入表格 
根据关键字提取交换机中的状态信息,并一次填入设计好的表格中,难点是字符串的截取和excel表格的设计。同款交换机相同的命令,可能用同一个关键字,抓取的信息也不一样,这个要多试几次。 
3、编写邮件,发送邮件。 
4、linux编写任务计划,crontab定期执行python代码,定期发送邮件。

代码

抓取交换机需要的配置信息

import pexpect
import sys
import datetime
import pymssql
import ostoday=datetime.date.today().strftime('%Y%m%d')
path = "/root/xunjian/"+today
os.mkdir(path,777)#创建目录def Switch(name,ip,passwd):try:#try except 防止有一个命令错误,导致程序不能进行,其实不加也可以,如果有命令没输出,下一个代码也会报错。name1="---- More ----"#模拟交换机出现的翻页提示child=pexpect.spawn('telnet %s'%ip)fout=open('/root/xunjian/'+today+'/'+'%s-%s.txt'%(name,ip),'wb+')child.logfile = foutchild.expect('login:')#提示用户登录,输入帐号,交换机不同,有所不同。child.sendline("admin")child.expect('(?i)ssword:')#提示输入密码child.sendline("%s"%passwd)            child.expect('<%s>'%name)child.sendline("display cpu-usage")#查看cpu状态child.expect('<%s>'%name)child.sendline("display memory")#查看内存状态child.expect('<%s>'%name)child.sendline("display  environment")#运行温度child.expect('<%s>'%name)child.sendline("display fan")#风扇状态,一般输出都有2个child.expect('<%s>'%name)child.sendline("display power")#电源状态child.expect('<%s>'%name)child.sendline("display ip routing-table")#路由表for i in range(10):index = child.expect([name1,'<%s>'%name])if ( index == 0 ):child.send(" ")else:child.sendline("display interface brief")#端口状态breakfor i in range(10):index = child.expect([name1,'<%s>'%name])if ( index == 0 ):child.send(" ")else:child.sendline("dis  version")#版本,为了看运行时间breakfor i in range(10):index = child.expect([name1,'<%s>'%name])if ( index == 0 ):child.send(" ")else:child.sendline("display log")#日志,日志较多,循环100个空格,怕输出不全。break                  for i in range(100):index = child.expect([name1,'<%s>'%name])if ( index == 0 ):child.send(" ")else:child.sendline("quit")breakexcept:passhost = 'x.x.x.x'#连接数据库,抓取数据库内的信息,交换机的名字、ip、密码
user = 'sa'
pwd = 'xxxx'
db = 'MAC'
conn = pymssql.connect(host=host,user=user,password=pwd,database=db,timeout=1,login_timeout=1,charset="utf8")
cur = conn.cursor()
sqls ="select * from [dbo].[F5HJSwitch]"
cur.execute(sqls)
listall = cur.fetchall()#SQl输出内容导成列表
for line in listall:Switch(line[1],line[2],line[3])
conn.commit()
conn.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

代码

提取需要的信息,并塞入表格,因为设备太多,我只展示一个设备的代码。

import pymssql
import xlwt
import datetime
from xlwt import *today=datetime.date.today().strftime('%Y%m%d')
txt='F51FA-HJ-S5560X-x.x.x.x.txt'#打开设备的配置信息,不建议用循环打开所有的,因为有些设备的输出会多空格等。
file = open('/root/xunjian/'+today+'/'+txt,'r+')listlist=file.readlines()#读取文档的每一行,至列表,如果不是双电源的问题,直接 for line in file.readlines():
i=1
for line in listlist:#读取列表每一行,因为两个电源的所有输出信息都一样,只能匹配关键字后输出下一行字符串,实属无奈。if '1       Normal' in line:power11=line[8:15].rstrip()#设备状态,都是匹配关键字,然后截取本来的字符串输出,这个要多试几次。print(power11)#确认输出是自己想要的字符串。if 'Uptime is' in line:#运行时间time11=line[-33:].rstrip()print(time11)if 'hotspot' in line:environment11=line[17:21].rstrip()#运行温度print(environment11)if 'Fan 1:' in line:fana11=listlist[i+1][-8:].rstrip()#电源状态,匹配关键字,截取下一行的字符串print(fana11)if 'Fan 2:' in line:fanb11=listlist[i+1][-8:].rstrip()#电源状态,匹配关键字,截取下一行的字符串print(fanb11)if 'in last 5 minutes' in line:cpu11=line[6:10].rstrip()#cpu使用率print(cpu11)if 'Mem:' in line:memory11=line[-7:].rstrip()#内存print(memory11)if 'To_F5-Core-S12508_Ten-G1' in line:#端口briefa11=line[20:30].rstrip()print(briefa11)if 'To_F5-Core-S12508_Ten-G2' in line:briefb11=line[20:30].rstrip()print(briefb11)if 'Current messages:' in line:#日志条目log11=line[-5:].rstrip()print(log11)if 'Routes' in line:routingtable11=line[-5:].rstrip()#路由条目print(routingtable11)i += 1workbook = xlwt.Workbook()#创建表格style = XFStyle()#初始化样式,此样式包含了单元格背景颜色和单元格边框两个属性。
pattern = Pattern()
pattern.pattern = Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = Style.colour_map['blue'] #设置单元格背景色为蓝色
style.pattern = pattern
borders = xlwt.Borders()#设置表格的边框,1是默认实线黑色。
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
style.borders = bordersstyle1 = XFStyle()#只有边框
borders = xlwt.Borders()
borders.left = 1
#borders.left = xlwt.Borders.THIN
borders.right = 1
borders.top = 1
borders.bottom = 1
style1.borders = bordersstyle3 = XFStyle()#初始化样式,带边框和表格内容居中。
borders = xlwt.Borders()
borders.left = 1
#borders.left = xlwt.Borders.THIN
borders.right = 1
borders.top = 1
borders.bottom = 1
style3.borders = borders
al = xlwt.Alignment()
al.horz = 0x02      # 设置水平居中
al.vert = 0x01      # 设置垂直居中
style3.alignment = alF51FSwitch = workbook.add_sheet('F51FSwitch',cell_overwrite_ok=True)#创建表格的某一分页first_col=F51FSwitch.col(0)#设置0、1、2、3列的列宽
sec_col=F51FSwitch.col(1)
thr_col=F51FSwitch.col(2)
for_col=F51FSwitch.col(3)
first_col.width=150*25
sec_col.width=100*25
thr_col.width=120*25
for_col.width=320*25F51FSwitch.write_merge(1,11,0,0,'QCMC-F5-1FA',style3)#合并单元格(1,11为行1到11行 0,0为列0到0),填入内容
#F51FSwitch.write_merge(1,10,0,1,'QCMC-F3-1FA')#合并0到1列,1到10行
F51FSwitch.write_merge(1,11,1,1,'10.20.5.1',style3)#添加style3的样式,只能填写一个,所以初始化样式的时候根据需求添加多个属性。
F51FSwitch.write(0,0,'设备名称',style)
F51FSwitch.write(0,1,'管理地址',style)
F51FSwitch.write(0,2,'检查项',style)
F51FSwitch.write(0,3,'检查结果',style)
F51FSwitch.write(1,2,'设备状态',style1)
F51FSwitch.write(2,2,'运行时间',style1)
F51FSwitch.write(3,2,'运行温度',style1)
F51FSwitch.write(4,2,'风扇A状态',style1)
F51FSwitch.write(5,2,'风扇B状态',style1)
F51FSwitch.write(6,2,'CPU使用率',style1)
F51FSwitch.write(7,2,'内存使用率',style1)
F51FSwitch.write(8,2,'聚合口A',style1)
F51FSwitch.write(9,2,'聚合口B',style1)
F51FSwitch.write(10,2,'日志条目',style1)
F51FSwitch.write(11,2,'路由条目',style1)
F51FSwitch.write(1,3,power11,style1)#添加抓取的字符串到相应的表格
F51FSwitch.write(2,3,time11,style1)
F51FSwitch.write(3,3,environment11,style1)
F51FSwitch.write(4,3,fana11,style1)
F51FSwitch.write(5,3,fanb11,style1)
F51FSwitch.write(6,3,cpu11,style1)
F51FSwitch.write(7,3,memory11,style1)
F51FSwitch.write(8,3,briefa11,style1)
F51FSwitch.write(9,3,briefb11,style1)
F51FSwitch.write(10,3,log11,style1)
F51FSwitch.write(11,3,routingtable11,style1)print ('创建excel文件完成!')
workbook.save('/root/xunjian/%sF5Switchxunjian.xls'%today)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128

发送邮件代码

前两个文章有介绍,不写了。

任务计划 linux crontab(不会的请百度)

crontab -l 查看任务计划 
这里写图片描述 
crontab -e编写任务计划 
这里写图片描述

结果

这里写图片描述

吐槽

代码一直执行没问题,突然前两天突然不发邮件了。 
发现没生成excel文档 
但是交换机的txt文档还在 
手动执行生成excel文档的代码,报错。说utf-8格式问题 
在windows python下面执行是OK的 
后来发现有一个txt的文档是ANSI格式,其它的txt都是UEF-8格式 
实在不明白为啥会有个txt是ANSI格式的,然后一顿改代码,在linux下面就是不行。 
后来无意中发现,交换机的运行时间怎么是三天???和代码出问题很相符啊!! 
然后然后,重启了这台交换机,居然好了,正常了。 
H3C交换机真坑??莫非是上次交换机冷重启的原因?现在正常重启后,正常了??吐血的一下午。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java免费游戏,java – 分配免费游戏

我的代码基本上是免费分配的,但是当60fps时,GC每30秒运行一次.使用DDMS检查应用程序以进行分配显示有大量的SimpleListIterator被分配.还有一些东西被分配,因为我使用Exchanger.SimpleListIterator来自(T obj&#xff1a;objs){}的每个循环.我的印象是编译器/翻译器会优化那些不…

python字典键值对转化为相应的变量名和变量值

将python字典键值对转化为相应的变量名和变量值可以使用以下方法&#xff1a; globals().update({"name":"value"}) locals().update({"var":"val"}) 举例如下&#xff1a; >>> D{a:1,b:2,c:3} >>> globals().updat…

IE与IE内核浏览器的那点事

真正的IE浏览器与IE内核的浏览器是不是一回事呢&#xff0c;是不是完全一样咧&#xff1f;如果不一样又有什么关系咧&#xff1f;下面一起来找答案吧&#xff01; 知识补给&#xff1a; 1.浏览内核 简介 2.IE内核浏览器 简介 我的结论&#xff1a;根据以往的经验和上面资料可…

Python 代码优化常见技巧

代码优化能够让程序运行更快&#xff0c;它是在不改变程序运行结果的情况下使得程序的运行效率更高&#xff0c;根据 80/20 原则&#xff0c;实现程序的重构、优化、扩展以及文档相关的事情通常需要消耗 80% 的工作量。优化通常包含两方面的内容&#xff1a;减小代码的体积&…

adb shell——Android虚拟机调试必须知道的命令

2019独角兽企业重金招聘Python工程师标准>>> 之前开发Android的时候喜欢用自己的手机来调试&#xff0c;特别是数据库&#xff01;&#xff01;&#xff01;因为是自己的手机嘛&#xff0c;可以安装一些类似数据库编辑器的工具&#xff0c;调试起来非常方便&#xf…

mysql6.10,MySQL经典50题-第6-10题

MySQL50-4-第6-10题本文中介绍的是第6-10题&#xff0c;涉及到的主要知识点&#xff1a;模糊匹配和通配符使用表的自连接in/not in连接查询的条件筛选image题目6题目需求查询“李”姓老师的数量分析过程使用通配符和like来解决SQL实现select count(t_name) from Teacher where …

增加系统右键菜单

本文介绍添加系统右键菜单&#xff0c;效果如下图&#xff1a; 原理很简单就是给注册表添加值&#xff0c;以下是添加系统右键菜单所要涉及的值。 KEY值&#xff1a;HKEY_CLASSES_ROOT\*\shell&#xff08;所有文件的右键菜单&#xff09;HKEY_CLASSES_ROOT\directory\shell&am…

Nginx-ingress部署及使用

目录 一 手动部署-官网版 1.1 获取资源1.2 安装RBAC1.3 安装基础资源1.4 安装ingress controllers1.5 创建ingress controllers service二 手动部署-github社区版(推荐&#xff09; 2.1 获取资源2.2 创建default backend2.3 确认验证三 ingress使用 3.1 创建demo环境3.2 创建i…

转:数字对讲机常识介绍

一、国内外数字对讲机发展动态 从整个移动通信的应用来划分&#xff0c;通信网络可分为公众移动通信和专业移动通信两大类&#xff0c;其中公众移动通信就是社会上广大消费者正在使用的2G、3G移动手机&#xff0c;它是为广大公众提供移动通信服务的&#xff0c;任何人都有权购买…

mac 启动php70 fpm,mac 启动php-fpm

Mac OS X 10.9已经自带有php-fpm&#xff0c;对于有干净系统强迫症的人&#xff0c;或者原装控来说&#xff0c;用brewhome重装一遍总感觉心里会有小兔子&#xff0c;下面把原装的php-fpm配置起来。直接运行&#xff0c;有报错找不到配置文件。$ php-fpm[11-Jan-2014 16:03:03]…

WinRAR(WinZip)压缩与解压实现(C#版Window平台)

本文的原理是借助Windows平台安装的WinRAR(WinZip)实现C#程序的调用&#xff08;注&#xff1a;WinRAR压缩解压WinZip同样适用&#xff09;。 先来看WinRAR&#xff08;WinZip&#xff09;自身的支持调用命令&#xff1a; 压缩命令&#xff1a;a {0} {1} -r 【{0}&#xff1a;…

Docker Consul 安装及使用服务发现

更多配置和原理&#xff1a;https://blog.csdn.net/liuzhuchen/article/details/81913562 从2016年起就开始接触Consul&#xff0c;使用的主要目的就是做服务发现&#xff0c;后来逐步应用于生产环境&#xff0c;并总结了少许使用经验。最开始使用Consul的人不多&#xff0c;为…

Visual Studio扩展工具添加与卸载

简介&#xff1a;vs 作为主流的开发工具之一&#xff0c;其强大的功能无可厚非&#xff0c;但日益增加的需求就使得vs的扩展工具成为优秀dev所必备的利器之一。 Visual Studio扩展工具添加 Visual Studio扩展工具的添加很简单&#xff0c;只需要选择需要的扩展工具然后一般安装…

python代码风格检查工具──pylint

pylint是一个python代码检查工具&#xff0c;可以帮助python程序员方便地检查程序代码的语法和风格&#xff0c;通过这个工具&#xff0c;可以使你的python代码尽量保持完美&#xff0c;哈哈。具体可以检查什么东西呢&#xff1f;比如你写了 from XXX import * 了&#xff0c;它…

php充值注入,PHP注入一路小跑

PHP注入一路小跑[ 2006-04-20 14:16:55 | 作者: 承諾 ]字体大小: 大 | 中 | 小很老的了&#xff0c;我是给我自己看的。忘了好多&#xff0c;补习一下‘ or ‘11‘/*‘%23‘ and password‘mypassid-1 union select 1,1,1id-1 union select char(97),char(97),char(97)id1 unio…

Visual Studio 扩展包(.vsix)制作

前言&#xff1a;上篇介绍了 Visual Studio扩展工具添加与卸载&#xff0c;本编要介绍的是Visual Studio 扩展包(.vsix)的制作。 方法&#xff1a; ①、下载并安装Visual Studio 2010 SDK。 vs 2010 开发工具下载SDK安装包官方下载地址&#xff1a;http://www.microsoft.com/d…

php5..6中文帮助,6.5. IDE integration

IDE 集成理想情况下&#xff0c;应用程序代码不应直接使用DI容器&#xff1a;应首选依赖项注入。但是&#xff0c;在某些情况下&#xff0c;可能会直接调用容器&#xff1a;编写根应用程序类(前端控制器等)或更通用的框架时编写工厂时维护或迁移旧版应用程序时编写功能测试时..…

公主病 - 百度百科

http://wapbaike.baidu.com/view/287227.htm?ssid0&from844b&uid3151E6C0905477A13653132D762BB6FB&pusz%401320_1001%2Cta%40iphone_2_4.1_3_537%2Cusm%403&bd_page_type1&tjXk_1_0_10_title

CDH6.2 Linux离线安装

1.概述 CDH&#xff0c;全称Clouderas Distribution, including Apache Hadoop。是Hadoop众多分支中对应中的一种&#xff0c;由Cloudera维护&#xff0c;基于稳定版本的Apache Hadoop构建&#xff0c;提供了Hadoop的核心&#xff08;可扩展存储、分布式计算&#xff09;&#…

vs怎么调试php程序,vscode如何调试运行c#程序

前提条件&#xff1a;安装.NET Core SDK安装vscode步骤&#xff1a;安装c#extension插件创建第一个项目&#xff0c;手动创建workspace文件夹在vscode中使用快捷键CTRLKCTRLO选择刚才创建的文件夹使用快捷键CTRLSHIFITY打开控制台使用下面的命令在打开的终端里面创建一个基础的…