python自动化运维三:数据报表定制以及scapy模块介绍

 

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})
3)设置加粗格式
worksheet.write(
'A1','Hello') (4)
往单元格中写入数据
worksheet.write(
'A2','World',bold)
worksheet.write(
'B2',u'
中文测试',bold)
worksheet.write(
2,0,100) (5)
以行列的方式往单元格中写入数据
worksheet.write(
3,0,35)
worksheet.write(
4,0,'=SUM(A3:A4)') (6)
写入公式
worksheet.insert_image(
'B5',r'e:/code.JPG') (7)
插入图片
workbook.close()

上面代码从步骤1到步骤7包含了创建,写入,插入等各种操作。最终生成的图片如下。

worksheet的界面其实还有很多个写入数据的方法:

1 worksheet.write_string(5,0,'text here') #写入字符

2 worksheet.write_number(6,0,10) #写入数字

3 worksheet.write(7,0,'None') #写入空白

4 worksheet.write_formula(8,0,'=SUM(A3:A4)') #写入公式

5 worksheet.write_datetime(9,0,datetime.datetime.now()) #写入时间

6 worksheet.write_url(10,0,'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=[[
1000,2500,2200,4000,3900,1000,20000],[200,100,5000,800,1100,1200,2400],[300,400,2000,1000,340,4000,5000]] (2)
加入数据
workbook=xlsxwriter.Workbook(
'demo.xlsx')
worksheet=workbook.add_worksheet(
u'
测试')
row_index=
1
for t in title:
worksheet.write(
0,row_index,t)
row_index+=
1
cow_index=0
for t in title2:
worksheet.write(cow_index,
0,t)
cow_index+=
1
worksheet.write_row('B2',data[0]) (3)
写入数据
worksheet.write_row(
'B3',data[1])
worksheet.write_row(
'B4',data[2])
chart=workbook.add_chart({
'type':'column'}) (4)
创建一个柱状图表
for row in range(2,5):
make_figure(chart,row) (5)
生成图表
chart.set_title({
'name':u'
商场人流量统计'}) (6) 设置标题
worksheet.insert_chart(
'A6',chart) (7)
插入报表
workbook.close()

得到如下的结果:

再来看下线形图的添加。代码如下。和柱状图大同小异

chart=workbook.add_chart({'type':'column'})
chart2=workbook.add_chart({
'type':'line'})
for row in range(2,5):
make_figure(chart,row)
for row in range(2,5):
make_figure2(chart2,row)
chart.set_title({
'name':u'
商场人流量统计柱状图'})
chart2.set_title({
'name':u'
商场人流量统计线性图'})

worksheet.insert_chart(
'A6',chart)
worksheet.insert_chart(
'I6',chart2)

但是在线形图中商场,广场,体育馆的颜色都一样,都为黑色,无法区分

代码修改下:

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 range(2,5):
make_figure2(chart2,row,
color[row-2])

得到如下的图表。区分线条颜色后更加一目了然。

图表还有很多种格式:

area:创建一个面积样式的图表:

bar:创建一个柱形样式的图表

pie:创建一个饼图样式的图表

scatter:创建一个散点样式的图表

stock:创建一个股票样式的图表

radar:创建一个雷达样式的图表。

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.11192.168.0.1发送了一个HTTP报文。send还可以设置发送的间隔和次数。比如send(a,inter=1,count=10)意味着发送10个数据包,每个数据包间隔1



也可以构造一个ICMP报文:a=IP(ttl=10)/ICMP()




那么在IPTCP报文中我们有那些字段可以设置呢,通过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的功能。相比命令行的traceroutescapy中的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

 

 

总之,scapy的网络功能太多,简直无所不能。有兴趣的可以去看下python黑帽子和Python绝技这两本书。

 

 

 

转载于:https://www.cnblogs.com/zhanghongfeng/p/7401710.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值