实验结果:

在这里插入图片描述

实验规划:

一.实验设备:
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)

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

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐