5-Jun-2022_NetDevOps学习分享——基于华为网络设备批量修改密码

注:本文主要基于了@弈心<<网络工程师的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的文件,注意此文件要与Python程序放置于同一个目录下
ip_context = open('ip_list.txt')
#遍历打开的IP文件中的IP地址
for ip_string in ip_context.readlines()
    #将遍历出来的ip字符串,去除行末空字符。
    ip_strip = ip_string.strip()
    #定义一个变量,paramiko作为客户端赋值给ssh_client,因为SSH基于C/S架构运行
    ssh_client = paramiko.SSHClient()
    #调用一个策略,让Paramiko主动接受来自服务器的公钥。若此处难以理解,可仔细翻阅SSH原理相关资料。
    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')
    #此处输出登录成功纯属为了告知程序观察者paramiko已经成功哪台登录交换机。
    print("成功登陆交换机" + ip_strip )
    #在Server端(此处指代华为服务器)创建一个SSH交互会话。便于后面paramiko向设备发送相关的指令。
    command = ssh_client.invoke_shell()
    #下面几行command.send("string")表示我们所需向设备发送的配置命令。
    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")
    #以下三行代码主要为了能让脚本在设备中的执行结果完整的打印出来,我们需要让Python程序先休眠1秒。并且以截取65535个字符的输出(65535)是paramiko单次能截取的最大内容数。而decode("ascii")则是让输出更好看。
    time.sleep(1)
    output = command.recv(65535)
    print(output.decode("ascii"))
    #改密完成后关闭Paramiko第一次的SSH连接。
    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连接结束之后别忘关掉SSH连接,避免占用系统资源。
    ssh_client_conn_again.close()
#关闭打开的“ip_list.txt”文件,避免占用系统资源。
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修改完设备密码之后,为了严谨起见,我们要进行二次登陆验证。

文章仅是基于单个需求整理出的方案。若有相关的建议、更深层次的需求挖掘,希望大家可以留言评论或者私信笔者。感谢大家的支持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值