首先,我们需要了解一些基础概念。SSH(Secure Shell)是一种安全协议,用于在网络中远程登录和执行命令。paramiko是一个Python库,提供SSHv2协议的客户端实现,可用于自动化的远程设备管理。
在编写Python脚本之前,我们需要确保网络设备已经开启了SSH服务,并且有权限进行远程登录和配置。本文将以华为网络设备为例进行说明。
接下来,我们开始编写Python脚本。首先导入paramiko库以及其他必要的库:
```python import paramiko import time import getpass ```
然后,通过input函数获取SSH的用户名,并通过getpass函数获取密码。密码输入时将不可见,但需要注意的是,在Windows系统中密码可能可见,需要提前做好保护措施。
接下来,我们创建一个ip地址列表,用于存放设备的IP地址。这里以五台设备为例,我们假设它们的IP地址分别为192.168.56.11、192.168.56.22、192.168.56.33、192.168.56.44和192.168.56.55。
使用for循环遍历IP地址列表,对每台设备进行SSH连接和配置。连接时,使用paramiko库中的SSHClient类,并设置自动添加未知主机密钥的策略。连接成功后,使用invoke_shell()方法唤醒shell界面,并使用send()方法发送命令进行配置。
在配置过程中,我们创建VLAN,并为每个vlan设置描述。由于网络设备的响应速度可能不同,为了确保配置成功,我们可以在创建每个VLAN后暂停1秒钟。
配置完成后,我们需要保存配置并关闭连接。使用send()方法发送save命令保存配置,并使用recv()方法接收设备返回的信息,最多接收65535个字符。最后,关闭SSH连接。
在编写脚本时,我们还可以考虑异常处理,以确保脚本的健壮性。例如,当设备连接失败或命令执行失败时,我们可以捕获异常并给出相应的提示信息。
此外,为了方便管理更多设备,我们可以将设备的IP地址存储在文本文件中,并在脚本中读取这些地址。这样可以避免手动修改脚本中的IP地址列表,提高脚本的通用性。
最后,我们可以将脚本保存为.py文件,并在Python环境中运行。运行脚本后,我们可以查看网络设备的配置信息,确认VLAN是否创建成功。
总结起来,使用Python和paramiko库实现网络设备的自动化配置,可以提高网络管理的效率,减轻管理员的工作强度。在实际应用中,我们可以根据具体需求对脚本进行修改和扩展,以满足不同的网络管理场景。
来源:公众号【网络技术干货圈】
作者:圈圈
ID:wljsghq
实验拓扑:
cloud连接本机,ip地址为192.168.56.1,五台交换机的配置的地址为192.168.1.11~55。现在通过paramiko,ssh进入五台设备,并且在五台设备上分别创建vlan10-vlan20这11个VLAN。
版本:python3.9
实验步骤:
一、ssh配置:
##创建秘钥 [sw2]dsalocal-key-paircreate ##配置SSH认证类型(密码/其他) [sw2]sshuserprinauthentication-typepassword [sw2]sshuserprinservice-typesTelnet [sw2]stelnetserverenable ##配置认证模式 [sw2]user-interfacevty04 [sw2-ui-vty0-4]authentication-modeaaa//配置认证模式 [sw2-ui-vty0-4]protocolinboundssh//允许ssh连接虚拟终端 ##配置本地用户信息 [sw2]aaa [sw2-aaa]local-userprinpasswordcipherHuawei@123 [sw2-aaa]local-userprinprivilegelevel15 [sw2-aaa]local-userprinservice-typessh
二、python脚本:
importparamiko importtime importgetpass #使用input函数,输入SSH的用户名 username=input('Username:') #通过getpass()函数接收密码,密码是不可见的,但是在windows上有bug,密码可见 password=getpass.getpass('Password:') #创建一个列表,表示五台设备最后8位的地址 ip_tail_list=[11,22,33,44,55] #使用for循环,接受SSH的秘钥,并分别依次连接到五台设备,注意需要将i转化为字符串 foriinip_tail_list: ip="192.168.56."+str(i) ssh_client=paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) print("Successfullyconnectto",ip) #使用invoke_shell()唤醒shell界面 command=ssh_client.invoke_shell() #使用command.send()函数创建VLAN,并且设置每个VLAN的描述;未来保证设备能够正常接受配置,每次创建1个VLAN后休息1s command.send("system ") forninrange(10,21): print("CreatingVlan"+str(n)) command.send("vlan"+str(n)+" ") command.send("descriptionPythonVlan"+str(n)+" ") time.sleep(1) #保存配置,并且通过command.recv()函数得到回信的信息,最多接受65535个字符 command.send("return ") command.send("save "+"y "+" ") time.sleep(2) output=command.recv(65535) print(output.decode('ascii')) #关闭连接 ssh_client.close()
如果管理的设备数目过多,可以直接通过读取txt文件的方式获取IP地址,仅需要将如下代码:
#创建一个列表,表示五台设备最后8位的地址 ip_tail_list=[11,22,33,44,55] #使用for循环,接受SSH的秘钥,并分别依次连接到五台设备,注意需要将i转化为字符串 foriinip_tail_list: ip="192.168.56."+str(i) ssh_client=paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) #......省略中间部分 ssh_client.close()
更换为下述即可:
#使用open()函数打开ip_list文件,并将读取的结果赋予f f=open("ip_list.txt","r") #调用readlines()函数,返回IP地址的列表,并使用for循环遍历;注意使用readlines()的每一个ip地址后带有 ,需要通过strip()函数去除 foriinf.readlines(): ip=i.strip() ssh_client=paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) #.......省略中间部分,在完成文件操作后,关闭文件 f.close() ssh_client.close()
执行效果:
…
在设备上检查是否配置成功,以SW1为例:
可以看到创建VLAN和添加VLAN描述成功。