使用python的matplotlib模块对netflow的流量信息分析(饼图)

实验结果:

在这里插入图片描述

实验规划:

一.实验设备:
CSR1000v,需要保证其能够和运行python的设备通信。
二.CSR1000v上的配置:
配置SSH,后续方便python实验paramiko连接,获取信息。
配置netflow,制造流量,用于后续测试。
三.两个.py模块:
第一个使用paramiko,连接CSR1000v获取netfflow的信息。
第二个则调用第一个模块,得到netflow信息,并提取其中协议和对应数据流量的信息,再通过matplotlib进行画图。

具体配置:

一、CSR1000v上Netflow配置:

flow record test-record
match application name
collect counter bytes
!
flow monitor test-monitor
record test-record
!
interface GigabitEthernet1
ip flow monitor test-monitor input

netflow信息如下,后续需要提取的是ssh和telnet的相关数据,做饼状图:
在这里插入图片描述

SSH:略

二、python脚本代码:
ssh_csr1000v.py: 使用paramiko连接到设备,并返回显示的信息。具体解释请参考如下链接信息:
https://blog.csdn.net/tushanpeipei/article/details/113704076

import time
import paramiko

def multicmd(ip, username, password, cmd_list, enable='', wait_time=2, verbose=True):
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, 22, username, password, timeout=5, compress=True)
    print("You have successfully connect to " + ip + '\n')
    # 激活交互式shell
    command = ssh.invoke_shell()
    # 等待网络设备回应
    time.sleep(wait_time)
    # 进入特权模式
    command.send('enable\n')
    command.send(enable + '\n')
    # 执行具体的命令
    for cmd in cmd_list:
        command.send(cmd)
    time.sleep(wait_time)
    # 获取路由器返回信息
    output = command.recv(65535)
    x = output.decode('ascii')
    if verbose:
        print(x)
    return x

netflow_pie.py:

from matplotlib import pyplot as plt
import re
import ssh_csr1000v


def find_netflow_info(ip, username, password, cmd_list, enable):
    # 提取返回的信息
    result_raw = ssh_csr1000v.multicmd(ip, username, password, cmd_list, enable, verbose=False)
    # 使用正则表达式对返回的信息进行处理,提取出协议名称和对应的流量大小
    netflow_info_raw = re.findall('APP NAME[\s\S]+', result_raw)[0]
    netflow_info = re.findall('\w+\s(\w+)\s+(\d+)',netflow_info_raw)
    # 返回处理后的信息
    return netflow_info


def mat_bing(size_list, name_list):
    # 调节图形大小,宽,高
    plt.figure(figsize=(6, 6))

    # 将某部分爆炸出来,使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙
    # explode = (0.01, 0.01, 0.01, 0.01)

    patches, label_text, percent_text = plt.pie(size_list,
                                                # explode=explode,
                                                labels=name_list,
                                                labeldistance=1.1,
                                                autopct='%3.1f%%',
                                                shadow=False,
                                                startangle=90,
                                                pctdistance=0.6)
    # labeldistance,文本的位置离原点有多远,1.1指1.1倍半径的位置
    # autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点
    # shadow,饼是否有阴影
    # startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
    # pctdistance,百分比的text离圆心的距离
    # patches, l_texts,p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本

    # 改变文本的大小,方法是把每一个text遍历。调用set_size方法设置它的属性
    for l in label_text:
        l.set_size = 30
    for p in percent_text:
        p.set_size = 20

    # 设置x,y轴刻度一致,这样饼图才能是圆的
    plt.axis('equal')
    plt.legend()
    plt.show()


if __name__ == "__main__":
	# 记录流量和协议好
    counters = []
    protocols = []
    # 获取协议和流量大小信息
    command = ['show flow monitor name test-monitor cache format table\n']
    netflow_info = find_netflow_info('192.168.1.155', 'Prin', 'Cisco123', command, 'cisco')
    # 通过遍历,将信息依次加入counter和protocol两个列表
    for info in netflow_info:
        protocols.append(info[0])
        counters.append(int(info[1]))
    # 绘图
    mat_bing(counters, protocols)

参考资料来源:现任明教教主

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格洛米爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值