python自动化运维三:数据报表定制以及scapy模块介绍
p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
Excel也是报表的一个重要的工具。这里首先接受下excel的操作。先来看一个简单的例子。代码如下
import xlsxwriter
def
excel_function():
workbook=xlsxwriter.Workbook('demo.xlsx')
(1)创建一个xlsx文件
worksheet=workbook.add_worksheet() (2)创建一个sheet
bold=workbook.add_format({'bold':True})
)设置加粗格式
worksheet.write('A1','Hello')
(4)往单元格中写入数据
worksheet.write('A2','World',bold)
worksheet.write('B2',u'中文测试',bold)
worksheet.write()
(5)以行列的方式往单元格中写入数据
worksheet.write()
worksheet.write(,'=SUM(A3:A4)')
(6) 写入公式
worksheet.insert_image('B5',r'e:/code.JPG')
(7) 插入图片
workbook.close()
上面代码从步骤1到步骤7包含了创建,写入,插入等各种操作。最终生成的图片如下。

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
在worksheet的界面其实还有很多个写入数据的方法:
1 ,'text here') #写入字符
2 ) #写入数字
3 ,'None') #写入空白
4 ,'=SUM(A3:A4)') #写入公式
5 ,datetime.datetime.now()) #写入时间
6 ,'ftp://www.python.org/') #写入网页链接
7worksheet.insert_image('B5',r'e:/code.JPG',{'url':'http://python.org'}) #插入图片的同时链接到具体的网址。点击图片跳到链接位置
接下来看下如何制作图表:先来看下面的例子,统计商场,广场以及体育馆周一到周七的人数分布
def
make_figure(chart,row):
chart.add_series({
'categories':u'=测试!$B$1:$H$1',
#设置X轴显示名字,同时也是分类统计的标识
'values':u'=测试!$B$'+str(row)+':$H$'+str(row),
#周一到周七的数据来源
'line':{'color':'black'},
'name':u'=测试!$A$'+str(row),
#引用业务名称为图例项
})
def
excel_function():
title=[u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期七']
title2=[u'地点',u'商场',u'体育馆',u'广场']
(1) 加入行和列的标题
data=[[]]
(2)加入数据
workbook=xlsxwriter.Workbook('demo.xlsx')
worksheet=workbook.add_worksheet(u'测试')
row_index=1
for
t in
title:
worksheet.write(,row_index,t)
row_index+=1
cow_index=0
for t
in title2:
worksheet.write(cow_index,,t)
cow_index+=1
])
(3)写入数据
worksheet.write_row(])
worksheet.write_row(])
chart=workbook.add_chart({'type':'column'})
(4)创建一个柱状图表
for row
):
make_figure(chart,row) (5) 生成图表
chart.set_title({'name':u'商场人流量统计'})
(6) 设置标题
worksheet.insert_chart('A6',chart)
(7)插入报表
workbook.close()
得到如下的结果:

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
再来看下线形图的添加。代码如下。和柱状图大同小异
chart=workbook.add_chart({'type':'column'})
chart2=workbook.add_chart({'type':'line'})
for
row in
):
make_figure(chart,row)
for
row in
):
make_figure2(chart2,row)
chart.set_title({'name':u'商场人流量统计柱状图'})
chart2.set_title({'name':u'商场人流量统计线性图'})
worksheet.insert_chart('A6',chart)
worksheet.insert_chart('I6',chart2)
但是在线形图中商场,广场,体育馆的颜色都一样,都为黑色,无法区分

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
代码修改下:
def make_figure2(chart,row,color_stye):
chart.add_series({
'categories':u'=测试!$B$1:$H$1',
'values':u'=测试!$B$'+str(row)+':$H$'+str(row),
'line':{'color':color_stye},
'name':u'=测试!$A$'+str(row),
})
color=['red','green','blue']
for
row in
):
make_figure2(chart2,row,])
得到如下的图表。区分线条颜色后更加一目了然。

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
图表还有很多种格式:
area:创建一个面积样式的图表:

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
bar:创建一个柱形样式的图表

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
pie:创建一个饼图样式的图表

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
scatter:创建一个散点样式的图表

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
stock:创建一个股票样式的图表

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
radar:创建一个雷达样式的图表。

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
二 scapy功能
scapy是一个很牛逼的网络探测工具包。可以对数据包进行伪造和解包,包括发送数据包,包探测,应当和反馈功能等。下面我们来看下具体的包构造
a=IP(ttl=10)/TCP()/"GET
/ HTTP/1.0\r\n\r\n" #构造一个IP包,上层业务是HTTP
a.src="192.168.0.11"
#设定IP报文的源和目的地址
a.dst="192.168.0.1"
send(a)
#发送数据报文
wireshark抓取的数据如下:192.168.0.11向192.168.0.1发送了一个HTTP报文。send还可以设置发送的间隔和次数。比如send(a,inter=1,count=10)意味着发送10个数据包,每个数据包间隔1秒
也可以构造一个ICMP报文:a=IP(ttl=10)/ICMP()。
那么在IP和TCP报文中我们有那些字段可以设置呢,通过ls(IP)和ls(TCP)可以查看到对应的参数
version
: BitField = (4)
ihl
: BitField = (None)
tos
: XByteField = (0)
len
: ShortField = (None)
id
: ShortField = (1)
flags
: FlagsField = (0)
frag
: BitField = (0)
ttl
: ByteField = (64)
proto
: ByteEnumField = (0)
chksum
: XShortField = (None)
src
: Emph = (None)
dst
: Emph = ('127.0.0.1')
options
: PacketListField = ([])
The
IP parameter is as follows None
sport
: ShortEnumField = (20)
dport
: ShortEnumField = (80)
seq
: IntField = (0)
ack
: IntField = (0)
dataofs
: BitField = (None)
reserved
: BitField = (0)
flags
: FlagsField = (2)
window
: ShortField = (8192)
chksum
: XShortField = (None)
urgptr
: ShortField = (0)
options
: TCPOptionsField = ({})
也可以通过IP().show来查看。通过设置这些参数我们就可以构造各种不同的数据报文。对应的物理层也可以用Ether().show()。另外如果要查看scapy实现了哪些协议,可以用ls()来查看
下面来看下traceroute的功能。相比命令行的traceroute,scapy中的traceroute首先通过探测机以SYN方式进行TCP服务扫描,同时启动tcpdump抓包,获取扫描过程经过的所有路由点,再通过graph方法进行路由IP轨迹绘制。中间调用ASN映射查询IP地理信息生成svg流程文档。现实svg文档需要安装graphviz软件包,否则无法显示出图像。apt-get
install graphviz
from
scapy.all import *
import
os
import
sys,time,subprocess
if
__name__=="__main__":
target="www.sina.com.cn"
res,unans=traceroute(target,dport=80,retry=-2)
res.graph()
#直接跳出svg图像
res.graph(target=">test.svg")
#保存为svg文件
time.sleep(1)
subprocess.Popen("/usr/bin/convert
test.svg test.png",shell=True) #转换为png文件
得到的运行结果”-”表示路由节点无回应或超时,”ll”表示扫描的指定服务无回应,“SA”表示扫描的指定服务有回应,一般是最后一个主机IP
WARNING:
No route found for IPv6 destination :: (no default route?)
Begin
emission:
***********Finished
to send 30 packets.
*****************Begin
emission:
Finished
to send 2 packets.
Begin
emission:
Finished
to send 2 packets.
.............
Received
41 packets, got 28 answers, remaining 2 packets
59.175.132.126:tcp80
1
192.168.1.1 11
2
100.64.0.1 11
3
100.64.0.1 11
5
171.208.199.221 11
6
202.97.29.5 11
7
111.175.227.78 11
9
59.175.132.126 SA
10
59.175.132.126 SA
11
59.175.132.126 SA
12
59.175.132.126 SA
13
59.175.132.126 SA
14
59.175.132.126 SA
15
59.175.132.126 SA
16
59.175.132.126 SA
17
59.175.132.126 SA
18
59.175.132.126 SA
19
59.175.132.126 SA
20
59.175.132.126 SA
21
59.175.132.126 SA
22
59.175.132.126 SA
23
59.175.132.126 SA
24
59.175.132.126 SA
25
59.175.132.126 SA
26
59.175.132.126 SA
27
59.175.132.126 SA
28
59.175.132.126 SA
29
59.175.132.126 SA
30
59.175.132.126 SA
scapy不但可以构造发送数据,也可以解析获取到的数据,解析获取的数据依靠的是sniff
dpkt=sniff(iface='wlan0',count=5)
wrpcap('test.pcap',dpkt)
print
dpkt[0].show
第一个包的显示结果。可以很清楚的看到各层的数据
###[
Ethernet ]###
dst
= ff:ff:ff:ff:ff:ff
src
= a4:56:02:4d:65:1f
type
= 0x806
###[
ARP ]###
hwtype
= 0x1
ptype
= 0x800
hwlen
= 6
plen
= 4
op
= who-has
hwsrc
= a4:56:02:4d:65:1f
psrc
= 192.168.0.1
hwdst
= ff:ff:ff:ff:ff:ff
pdst
= 192.168.0.1
###[
Padding ]###
load
=
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
还可以设置过滤条件,比如只获取某个协议的数据,通过设置filter的值。注意,filter的协议必须为小写,filter=”UDP”会报错。
dpkt=sniff(iface='wlan0',filter="udp",count=5)
print
dpkt[0].show()
只获取udp的数据。
###[
Ethernet ]###
dst
= a4:56:02:4d:65:1f
src
= 00:26:82:07:ef:3c
type
= 0x800
###[
IP ]###
version
= 4L
ihl
= 5L
tos
= 0x0
len
= 58
id
= 9166
flags
= DF
frag
= 0L
ttl
= 64
proto
= udp
chksum
= 0x9588
src
= 192.168.0.11
dst
= 192.168.0.1
\options
\
###[
UDP ]###
sport
= 52061
dport
= domain
len
= 38
chksum
= 0x255e
###[
DNS ]###
id
= 2987
qr
= 0L
opcode
= QUERY
aa
= 0L
tc
= 0L
rd
= 1L
ra
= 0L
z
= 0L
rcode
= ok
qdcount
= 1
ancount
= 0
nscount
= 0
arcount
= 0
\qd
\
|###[
DNS Question Record ]###
|
qname = 'hm.baidu.com.'
|
qtype = A
|
qclass = IN
an
= None
ns
= None
ar
= None
还可以设置回调函数来对每个包进行分析:
def
show_packets(packets):
print
packets.summary()
pass
def
scapy_function_try():
dpkt=sniff(iface='wlan0',count=20,prn=show_packets)
得到的结果如下:
Ether
/ IP / TCP 192.168.0.11:56554 > 182.140.245.28:http A
Ether
/ IP / TCP 192.168.0.11:56532 > 182.140.245.28:http A
Ether
/ IP / TCP 182.140.245.28:http > 192.168.0.11:56554 A
Ether
/ IP / TCP 182.140.245.28:http > 192.168.0.11:56532 A
Ether
/ ARP who has 192.168.0.1 says 192.168.0.1 / Padding
Ether
/ IP / TCP 192.168.0.11:56552 > 182.140.245.28:http A
Ether
/ IP / TCP 182.140.245.28:http > 192.168.0.11:56552 A
Ether
/ ARP who has 192.168.0.1 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.227 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.228 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.229 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.230 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.231 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.232 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.235 says 192.168.0.1 / Padding
Ether
/ ARP who has 192.168.0.236 says 192.168.0.1 / Padding
Ether
/ IP / TCP 192.168.0.11:44564 > 106.39.162.37:http FA
Ether
/ ARP who has 192.168.0.1 says 192.168.0.1 / Padding
Ether
/ IP / TCP 180.97.33.108:https > 192.168.0.11:37634 FA
Ether
/ IP / TCP 192.168.0.11:37634 > 180.97.33.108:https PA / Raw
p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
总之,scapy的网络功能太多,简直无所不能。有兴趣的可以去看下python黑帽子和Python绝技这两本书。
python自动化运维三:数据报表定制以及scapy模块介绍的更多相关文章
- Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|
内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...
- Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...
- python自动化运维之CMDB篇-大米哥
python自动化运维之CMDB篇 视频地址:复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1Oj_sglTi2P1CMjfMkYKwCQ ...
- Day1 老男孩python自动化运维课程学习笔记
2017年1月7日老男孩python自动化运维课程正式开课 第一天学习内容: 上午 1.python语言的基本介绍 python语言是一门解释型的语言,与1989年的圣诞节期间,吉多·范罗苏姆为了在阿 ...
- python自动化运维学习第一天--day1
学习python自动化运维第一天自己总结的作业 所使用到知识:json模块,用于数据转化sys.exit 用于中断循环退出程序字符串格式化.format字典.文件打开读写with open(file, ...
- 【目录】Python自动化运维
目录:Python自动化运维笔记 Python自动化运维 - day2 - 数据类型 Python自动化运维 - day3 - 函数part1 Python自动化运维 - day4 - 函数Part2 ...
- python自动化运维篇
1-1 Python运维-课程简介及基础 1-2 Python运维-自动化运维脚本编写 2-1 Python自动化运维-Ansible教程-Ansible介绍 2-2 Python自动化运维-Ansi ...
- Python自动化运维的职业发展道路(暂定)
Python职业发展之路 Python自动化运维工程 Python基础 Linux Shell Fabric Ansible Playbook Zabbix Saltstack Puppet Dock ...
- python自动化运维之路~DAY5
python自动化运维之路~DAY5 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模块的分类 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数 ...
随机推荐
- 如何将md文件转换成带目录的html文件
配置环境node 去官网下一个node安装包,下一步下一步: 由于现在的node都自带npm,直接 npm install i5ting_toc 这样安装好了i5ting_toc这个包, 进入你实现准 ...
- svo笔记
使用 要想在ros中有更多的debug信息,要在global.h中把ros log的级别设为debug,最简单的就是把SVO_DEBUG_STREAM(x)改成ROS_INFO_STREAM(x) # ...
- JavaWeb 后端 <四> 之 Cookie HttpSession 学习笔记
一.会话管理概述 1.什么是会话? 好比一次通话.打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话. 有功能 可以 文件 新建会话 2.解决的问题是什么? ...
- POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)
POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...
- Centos 6.5 安装python3.6
废话不多说,直接上步骤 wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2rc1.tgz 进入 https://www.python.o ...
- Linux查看内存占用情况
输入:top PID 进程的ID USER 进程所有者 PR 进程的优先级别,越小越优先被执行 Ninice 值 VIRT 进程占用的虚拟内存 RES 进程占用的物理内存 SHR 进程使用的共享内存 ...
- 【TensorFlow入门完全指南】模型篇·逻辑斯蒂回归模型
import库,加载mnist数据集. 设置学习率,迭代次数,batch并行计算数量,以及log显示. 这里设置了占位符,输入是batch * 784的矩阵,由于是并行计算,所以None实际上代表并行 ...
- 某天U盘插在笔记本打不开了,是U盘坏了还是电脑的问题?
五六月份忙着毕业设计与毕业论文,U盘在这个时候就是大功臣啦! 然而打印完最终版本论文上交后,再次把U盘插在自己的笔记本上读取失败了... 只有一个空白的图标,打不开,也无法格式化. 试着删除,拔了又插 ...
- SpringWeb增删改查
模型类: package com; public class Model { private int id; private String name; private String dtype; pr ...
- Xamarin Android绑定微信SDK
现在几乎所有的APP都集成了向微博,微信等社交平台分享的功能.这些社交平台官方也提供了SDK让开发者使用,对于Android和IOS平台而言,只需要下载官方的SDK,按照官方说明文档进行集成就可以轻松 ...