实验结果:
实验规划:
一.实验设备:
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)
参考资料来源:现任明教教主