注:本文主要基于了@弈心<<网络工程师的Python之路>>的一些编程思想进行改写。 本专栏的文章主要是一些日常生活、工作遇到的问题,在查阅到相关的资料后整理得出的一些解决方案;希望能尽可能的帮助更多的同行。
前言
前段时间看到一个哥们的需求,那就是给几百台华为的网络交换机进行改密操作。大规模重复性的工作很容易让人感觉到厌烦,从而也更容易出错。 为了解决上述问题,笔者尝试使用Python写了一个小程序用以实现对设备的批量改密及改密后自动验证的操作。 本文基于Windows 10及Python 3的环境进行编写。
一、环境准备
1、安装Python 3:下载链接 2、安装Paramiko模块。可以在Powershell中使用指令“pip3 install paramiko”进行安装。但因为paramiko的镜像源在国外。所以可以使用国内的镜像源进行下载。我用的是豆瓣的网站进行下载“pip3.8 install paramiko -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com” 3、安装Ensp模拟器。
二、拓扑搭建及配置
我们在ENSP使用S5700的镜像搭建网络拓扑。使用Cloud桥接自己的主机的指定网卡中。 单台设备配置案例:
一、基础配置
[]内的值推荐读者自行设置。
system-view
sysname [device-name]
vlan [vlan-id]
quit
interface Vlanif [vlan-id]
ip address [ip-address] [mask]
quit
二、SSH登录认证配置
ssh user python
ssh user python authentication-type password
ssh user python service-type stelnet
user-interface vty 0 4
authentication-mode aaa
user privilege level 15
protocol inbound ssh
quit
aaa
local-user python password cipher [password]
local-user python privilege level 15
local-user python service-type ssh
return
#别忘了保存配置
save
y
三、Python程序
1.引入库
代码如下:
import paramiko
import time
2.程序主体
代码如下:
ip_context = open('ip_list.txt')
for ip_string in ip_context.readlines()
ip_strip = ip_string.strip()
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
'''定义连接选项,调用connect()连接方法。注意此处的ip_strip是变量。username和password
则是设备改密前的密码。'''
ssh_client.connect(hostname = ip_strip ,username = 'python', password = 'Python@123')
print("成功登陆交换机" + ip_strip )
command = ssh_client.invoke_shell()
command.send("system-view\n")
command.send("aaa\n")
command.send("local-user python password cipher Python@123-1\n")
command.send("return\n")
command.send("save\n")
command.send("y\n")
time.sleep(1)
output = command.recv(65535)
print(output.decode("ascii"))
ssh_client.close()
ssh_client_conn_again = paramiko.SSHClient()
ssh_client_conn_again.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client_conn_again.connect(hostname=ip_strip, username='python', password='Python@123-1')
print("交换机" + ip_strip + "二次登陆成功,密码修改完成")
ssh_client_conn_again.close()
ip_context.close()
3.程序总览
import paramiko
import time
ip_context = open('ip_list.txt')
for ip_string in ip_context.readlines():
ip_strip = ip_string.strip()
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname = ip_strip ,username = 'python', password = 'Python@123')
print("成功登陆交换机" + ip_strip )
command = ssh_client.invoke_shell()
command.send("system-view\n")
command.send("aaa\n")
command.send("local-user python password cipher Python@123-1\n")
command.send("return\n")
command.send("save\n")
command.send("y\n")
time.sleep(10)
output = command.recv(65535)
print(output.decode("ascii"))
ssh_client.close()
ssh_client_conn_again = paramiko.SSHClient()
ssh_client_conn_again.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client_conn_again.connect(hostname=ip_strip, username='python', password='Python@123-1')
print("交换机" + ip_strip + "二次登陆成功,密码修改完成")
ssh_client_conn_again.close()
ip_context.close()
运行截图展示: 程序编写思想: 程序的详细注释已经在上文详细叙述。我觉的这个对大量设备进行自动化改密这个需求具体可以划分为几个小任务,而这几个小任务我先用疑问句进行表达。1、如何让python程序登录交换机?2、怎么让python程序批量的执行同一个任务?3、怎么让这个需求更为严谨的执行?我该怎么去验证呢? 而我是这么思考的: 1、对于第一问,首先我们得了解Python哪些模块具备SSH的功能。本篇文章主要使用了Paramiko模块,用到了Paramiko的一些函数。 2、使用for语句可以循环执行一个任务。 3、对于网工来说,我们除了完成工作以外,网络设备的稳定性、安全性、高可靠性等等是和我们息息相关的。在本次让paramiko修改完设备密码之后,为了严谨起见,我们要进行二次登陆验证。
文章仅是基于单个需求整理出的方案。若有相关的建议、更深层次的需求挖掘,希望大家可以留言评论或者私信笔者。感谢大家的支持!
|