欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

网络工程师如何通过Paramiko库实现Python设备远程登录探索

最编程 2024-02-10 09:15:08
...

实验背景

与Netmiko不同,Paramiko不会在做配置的时候替我们自动加上sys、return等命令,也不会在执行各种display命令后自动保存该命令的回显内容,一切都需要我们手动搞定。另外,Python不像人类,后者在手动输入每个命令后会间隔一定时间,再输入下一个命令。Python是一次性执行所有脚本里的命令的,中间没有间隔时间。当你要一次性输入很多个命令时,便经常会发生SSH终端跟不上速度,导致某些命令缺失没有被输入的问题(用传统的“复制、粘贴”方法给网络设备做配置的人应该遇到过这个问题)。同样,在用print()函数输入回显内容或者用open.write()将回显内容写入文档进行保存时,也会因为缺乏间隔时间而导致Python“截屏”不完整,从而导致回显内容不完整。Netmiko自动帮我们解决了这个问题,也就是说,不管上面所举的Netmiko例子中config_commands列表中的元素(命令)有多少个,都不会出现因为间隔时间不足而导致配置命令缺失的问题。而在Paramiko中,我们必须导入time模块,使用该模块的sleep()方法来解决这个问题, 与Netmiko一样,Paramiko也是第三方模块,需要使用pip来下载安装,方法如下所示。

pip3.10 install paramiko

下载完毕后,进入Python 3.10解释器,如果import paramiko没有报错,则说明Paramiko安装成功。

实验准备

将LSW2的ssh密码改为123,模拟验证失败,连接LSW4的接口关闭,模拟不可达。

创建一个ip.txt的文本用于存放ip地址,创建一个cmd.txt用于存放命令,创建本次实验脚本lab.6py

实验目的

1.使用SSH登录LSW2~LSW5各台设备,并将其stp模式改为STP,默认为MSTP。

2.使用异常处理模块,当遇到不能登录到的设备跳过其设备,并记录到文档。

实验拓扑

将ensp的LSW1与本地虚拟网卡loopback0进行桥接,模拟将自己的电脑桥接到以下拓扑网络中。

实验脚本

import paramiko
import time
import getpass
import socket  #处理网络不可达引起的socket.error
username=input('Username:')
password=getpass.getpass('Password:')
f1=open('验证失败.txt','a+') #创建文件存放验证失败的设备
f2=open('不可达.txt','a+')   #创建文件存放不可达设备
iplist=open('ip.txt')
for line in iplist.readlines():
    try:
        ip=line.strip()
        ssh_client=paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname=ip,username=username,password=password)
        print('成功登录到交换机:'+ip)
        command= ssh_client.invoke_shell()
        cmdlist=open('cmd.txt')
        for line in cmdlist.readlines():
            command.send(line)
        cmdlist.close()
        time.sleep(2)
        output=command.recv(65535).decode('ascii')
        print(output)
    except paramiko.ssh_exception.AuthenticationException:
        print(ip+'验证失败!')
        f1.write(line+'\n')
    except socket.error:
        print(ip+'不可达!')
        f2.write(line+'\n')
iplist.close()
f1.close()
f2.close()
ssh_client.close()

实验代码解释

代码分段讲解如下。

(1)调用Paramiko的SSHClient()方法,将其赋值给变量ssh_client。顾名思义,windows主机做SSH客户端,而SSH服务端则是我们要登录的交换机。

ssh_client=paramiko.SSHClient()

(2)默认情况下,Paramiko会拒绝任何未知的SSH公钥(publickey),这里我们需要使用ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 来让Paramiko接受SSH服务端提供的公钥,这是任何时候使用Paramiko都要用到的标准配置

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

(3)在做完Paramiko关于SSH公钥相关的配置后,调用Paramiko.SSHClient()的connect()函数进行SSH登录,该函数包含3个必选的参数hostname、username和password,分别对应我们创建的ip、username和password 3个变量,也就是远程登录的设备的主机名/IP地址、SSH用户名和密码。如果SSH登录设备成功,则提示用户并告知所登录的交换机的管理IP地址。

 ssh_client.connect(hostname=ip,username=username,password=password)

(4)SSH连接成功后,需要调用Paramiko.SSHClient()的invoke_shell()方法来唤醒shell,也就是华为设备IOS命令行,并将它赋值给变量command。

command=ssh_client.invoke_shell()

(5)之后便可以调用invoke_shell()的command()函数来向交换机发布命令。这里使用for循环

cmd_file里面的命令。

cmdlist=open('cmd.txt')
for line in cmdlist.readlines():
    command.send(line)
    cmdlist.close()

(6)这里的command.recv(65535)中的65535代表截取65535个字符的回显内容,这也是Paramiko一次能截取的最大回显内容数。另外,与Telnetlib类似,在Python 3中,Paramiko截取的回显内容格式为字节型字符串,需要用decode("ascii")将其解析为ASCII编码,否则打印出来的output的内容格式会很难看。

time.sleep(3)
output=command.recv(65535).decode('ascii')
print(output)

(7)配置完毕后,使用close方法退出SSH。运行代码后看结果、做验证。

ssh_client.close

实验结果

 

 

推荐阅读