当然做为一个网络工程师来说,调试交换机和路由器等设备是你的本职,但是在当下这个互联网这么发达的时代,还有许多知识可以帮助你大大提高工作效率。举一个简单的例子,当你接手一个新的环境,需要给所有交换机创建业务 vlan ,那么就需要你一台台登录,然后进去敲那么几行命令,虽然内容很少,但是一台台登录设备着实是大量重复且没有意义的操作。又或者需要你将所有设备的 display cur 的全局配置导出来留作备份,也是需要一台台的登录。我也是苦于上面两个情况的折磨,最后上网去搜索了很多交换机自动备份的脚本,了解到了 Python 这个计算机语言,当我开始接触并了解它的时候,发现他很好的解决了我们这些批量重复性的工作。 话不多说,直接上代码。
代码分段解释:
首先第一步就是需要导入三个功能包 paramiko time sys 分别是为下列代码提供功能支持的。 先设置 username 和 password ,这里为了图方便就直接写成明文在脚本内了。然后代码往下继续就是一个简单的 for 循环,就是为了自动生成 IP 地址,不需要我们手动一个个的输入。 再往下就是调用 paramiko 模块中的 SSH 登录的功能模块,通过 SSH 去登录设备。相比较其他的 SSH 登录模块,paramiko 是最适合交换机网络设备这些 SSH 的。当然也有 telnet 登录方式,使用 Telnetlib 模块就行。
username = 'zhangsan'
password = 'zhangsan'
for i in range(1,62):
ip = '10.10.250.' + str(i)
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip,username=username,
password=password,look_for_keys=False)
command = ssh_client.invoke_shell()
代码分段解释
这里的 command.send(xxxx)
括号内的内容就是向设备发送的命令,结尾的 \n
的意思是说换行,不然的话这些命令全都为一行进行输入了,这里面的内容可以根据你自己对于脚本的要求进行输入。
下列代码就是为zhangsan创建一个登录用户名密码,账号权限这些。
最后一行的 time.sleep(10)
是这些命令输入完成后强制等待10秒钟的回显内容,这里看命令来定吧,时间太短可能会导致命令还没有输完这个连接就已经中断了,为了确保命令输入完成,最好设置等待时间。
这段是我们所需要的核心内容,这里的命令你可以根据你的实际情况进行自定义,这里写的用户创建,你改成 dis cu 就是设备备份
command.send('screen-length 0 temporary\n')
#系统命令
command.send('sys\n')
command.send('aaa \n')
command.send('local-user zhangsan password irreversible-cipher abcD@1234\n')
command.send('local-user zhangsan service-type terminal ssh \n')
command.send('local-user zhangsan level 3 \n')
command.send('quit \n')
command.send('ssh user zhangsan service-type stelnet \n')
command.send('ssh user zhangsan authentication-type password \n')
command.send('quit \n')
command.send('save \n')
command.send('y \n')
command.send('quit \n')
time.sleep(10)
#抓取回显,放入output变量
output = command.recv(65535).decode('utf-8')
print(output)
代码分段解释:
这一段就是整个代码的结尾了,他主要的作用就是把你所需要的内容进行保存,按照 IP 进行文件命令,把指定的 IP 设备的配置保存到对应的文件内。并每完成循环一个IP 创建文件,需要关闭文件f1.close()
,f2.close()
,然后重新开启新的一个设备配置。
也根据大佬的优化新增了一个删除多余空行,来实现更好的可读性。
#保存结果到python脚本同目录下的result文件夹中
f1 = open(f".\\result\\{ip}logo.txt","w")
f1.write(output)
f1.close()
ssh_client.close()
#对于保存在result的文件夹中的文档,重新检查并删除空格,新的文档存放在new_file这个文件夹下
f1 = open(f".\\result\\{ip}logo.txt","r")
f2 = open(f".\\new_file\\new_{ip}logo.txt","w")
for line in f1.readlines():
if line.split():
f2.write(line)
f1.close()
f2.close()
完整代码:
这里可以拿去直接使用:
import paramiko
import time
import sys
username = 'zhangsan'
password = 'zhangsan'
for i in range(1,62):
ip = '10.10.250.' + str(i)
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip,username=username,
password=password,look_for_keys=False)
command = ssh_client.invoke_shell()
print('=-=-=-=-=-=-=-=-=-=-=-=-=-=')
print('已经成功登陆交换机 Layer3Switch-' + str(i-10) + ' ' + ip)
# 关闭分屏功能
command.send('screen-length 0 temporary\n')
#系统命令
command.send('sys\n')
command.send('aaa \n')
command.send('local-user zhangsan password irreversible-cipher abcD@1234\n')
command.send('local-user zhangsan service-type terminal ssh \n')
command.send('local-user zhangsan level 3 \n')
command.send('quit \n')
command.send('ssh user zhangsan service-type stelnet \n')
command.send('ssh user zhangsan authentication-type password \n')
command.send('quit \n')
command.send('save \n')
command.send('y \n')
command.send('quit \n')
time.sleep(10)
#抓取回显,放入output变量
output = command.recv(65535).decode('ascii')
print(output)
#保存结果到python脚本同目录下的result文件夹中
f1 = open(f".\\result\\{ip}logo.txt","w")
f1.write(output)
f1.close()
ssh_client.close()
#对于保存在result的文件夹中的文档,重新检查并删除空格,新的文档存放在new_file这个文件夹下
f1 = open(f".\\result\\{ip}logo.txt","r")
f2 = open(f".\\new_file\\new_{ip}logo.txt","w")
for line in f1.readlines():
if line.split():
f2.write(line)
f1.close()
f2.close()
代码存在问题:
这个代码只能用于比较理想的情况下,实际情况还有很多变量。 1、仅适用于管理IP属于连续性的网络环境,但实际很有可能管理IP是五花八门的,或者中间有跳过很多IP的情况。 2、使用于所有设备正常可访问,若出现异常报错(例如设备IP不可达,设备用户名密码错误等),代码会中止运行。 3、每次配置脚本不一样的话需要手动修改代码的内容,若是像我这样不是很懂python的朋友,可能会误删除代码内容,导致最终的运行报错。 4、设备和命令都需要一步步的登录,若设备数量较多,等待配置时间会很长。因为代码内容是一行行的运行,一行行的去执行。
目前这几个问题,我也在想办法解决,初步接触了python发现对于我来说是一个很好的提高工作效率的辅助工具。