python自动登录远程设备的几种方式(华为设备)
2025-04-09
网络
00
请注意,本文编写于 480 天前,最后修改于 51 天前,其中某些信息可能已经过时。

目录

拓扑
通过Telnet进行登录
引入telnetlib、time库(安装python时自带)
连接设备参数
连接设备
执行命令
打印输入
完整代码
运行结果
通过SSH进行登录
paramiko登录
引入paramiko、time库
连接设备参数
连接设备
执行命令
打印输入
完整代码
运行结果
netmiko登录
完整代码
运行结果
讲解
批量登录用户名密码不同的设备(JSON)
python代码
讲解
运行结果
批量登录IP地址不连续的设备
python代码
讲解
运行结果

其实登录远程设备(交换机路由器)的方式无非就是通过SSH或者是Telnet这两个协议,当然最主要的还是SSH,这里主要讲的是通过这两个协议登录远程设备的几个方式

拓扑

​ 本文都是用的这个拓扑,主要通过编写python脚本来登录其中的交换机,重点不是这个拓扑,所以这里就简单的配置。交换机连接的那个可以尝试在vlan 1配置地址,接口是默认连通vlan 1,所以vlan 1是管理IP地址

账号密码:Telnet:zzz/12345 SSH:ren/12345

展开代码
# Telnet交换机配置 [SW-telnet]user-interface vty 0 4 [SW-telnet-ui-vty0-4]authentication-mode aaa [SW-telnet-ui-vty0-4]protocol inbound telnet [SW-telnet-ui-vty0-4]q [SW-telnet]aaa [SW-telnet-aaa]local-user zzz password cipher 12345 Info: Add a new user. [SW-telnet-aaa]local-user zzz privilege level 15 [SW-telnet-aaa]local-user zzz service-type telnet [SW-telnet-aaa]q [SW-telnet]stelnet server enable Info: Succeeded in starting the Stelnet server. [SW-telnet]ssh authentication-type default password [SW-telnet]
展开代码
# SSH交换机配置 [SW3]user-interface vty 0 4 [SW3-ui-vty0-4]authentication-mode aaa [SW3-ui-vty0-4]protocol inbound ssh [SW3-ui-vty0-4]q [SW3]aaa [SW3-aaa]local-user ren password cipher 12345 Info: Add a new user. [SW3-aaa]local-user ren privilege level 15 [SW3-aaa]local-user ren service-type ssh [SW3-aaa]q [SW3]stelnet server enable Info: Succeeded in starting the Stelnet server. [SW3]ssh authentication-type default password [SW3]

后面打算是尝试批量登录交换机,所以设置了两个SSH的交换机,但都是一样的配置,一个地址为11,一个为12

通过Telnet进行登录

引入telnetlib、time库(安装python时自带)

不知道为啥,我电脑执行脚本的时候他没有找到telnet库,可能是环境变量的原因,不过这次我就直接在虚拟机上弄了。至于time库是为了让设备能够有时间执行输入命令,不然会吞掉个别指令

展开代码
import telnetlib import time

连接设备参数

一般这三个就可以,不排除一些比较严格会出现端口、使能密码等

展开代码
host = "192.168.88.21" user = "zzz" password = "12345"

连接设备

通过telnetlib.Telnet()函数连接上设备,然后通过捕抓关键字,输入用户和密码

展开代码
tn = telnetlib.Telnet(host) tn.read_until(b"Username:") tn.write(user.encode('ascii') + b"\n") tn.read_until(b"Password:") tn.write(password.encode('ascii') + b"\n")

执行命令

展开代码
tn.write(b"sys\n") tn.write(b"interface LoopBack 0\n") tn.write(b"ip address 1.1.1.1 255.255.255.255\n")

打印输入

最后通过close()函数关闭Telnet连接

展开代码
print(tn.read_very_eager().decode('ascii')) tn.close()

完整代码

展开代码
import telnetlib import time host = "192.168.88.21" user = "zzz" password = "12345" tn = telnetlib.Telnet(host) tn.read_until(b"Username:") tn.write(user.encode('ascii') + b"\n") tn.read_until(b"Password:") tn.write(password.encode('ascii') + b"\n") tn.write(b"sys\n") tn.write(b"interface LoopBack 0\n") tn.write(b"ip address 1.1.1.1 255.255.255.255\n") # 延迟等待 time.sleep(0.5) tn.write(b"quit\n") print(tn.read_very_eager().decode('ascii')) tn.close()

运行结果

通过SSH进行登录

​ 跟Telnet相比,SSH的安全性更高。这里我们主要用paramiko和netmiko两个库来进行SSH登录,同时这两个库跟telnetlib不同,并不是python的内置库,我们需要提前安装,也简单

展开代码
pip install paramiko pip install netmiko

直接在命令行输入上面两条命令就行,这里我就不演示了

paramiko登录

引入paramiko、time库

展开代码
import paramiko import time

连接设备参数

展开代码
ip = "192.168.88.11" username = "ren" password = "12345"

连接设备

这里的三行代码,算是连接的标志,SSH连接设备都需要这三行代码

展开代码
ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password)

执行命令

成功连接设备之后,需要通过invoke_shell()来调用命令行

展开代码
print ("Successfully connected to ",ip) command = ssh_client.invoke_shell() command.send("sys\n") command.send("int loop 1\n") command.send("ip address 2.2.2.2 255.255.255.255\n") command.send("return\n")

打印输入

展开代码
time.sleep(2) output = command.recv(65535) print (output.decode("ascii")) ssh_client.close

完整代码

展开代码
import paramiko import time ip = "192.168.88.11" username = "ren" password = "12345" ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username,password=password) print ("Successfully connected to ",ip) command = ssh_client.invoke_shell() command.send("sys\n") command.send("int loop 1\n") command.send("ip address 2.2.2.2 255.255.255.255\n") command.send("return\n") time.sleep(2) output = command.recv(65535) print (output.decode("ascii")) ssh_client.close

运行结果

netmiko登录

看了前面的,也应该有所了解,这里就直接先上代码和结果

完整代码

展开代码
from netmiko import ConnectHandler SW2 = { 'device_type': 'huawei', 'ip': '192.168.88.12', 'username': 'ren', 'password': '12345', } connect = ConnectHandler(**SW2) print ("Successfully connected to " + SW2['ip']) config_commands = ['int loop 1', 'ip address 3.3.3.3 255.255.255.255'] output = connect.send_config_set(config_commands) print (output) result = connect.send_command('disp cur int loop 1') print (result)

运行结果

讲解

​ 这里的netmikok主要是通过先导入netmiko的ConnectHandler,这个是用来建立与网络设备的连接。然后跟前两个代码不同的是,将设备类型、IP地址、用户名和密码定义为了一个字典,后面直接通过**将参数传递给ConnectHandler。将配置命令定义为一个列表,使用send_config_set方法将这些命令发送到设备上。

批量登录用户名密码不同的设备(JSON)

​ 在实际生活中,需要登录的交换机可能会存在用户名密码不一样的情况,但是需要更改的配置是一样的,这时候我们就可以尝试更改下我们的登录方式,联合JSON登录

当然,这里我们需要先将环境整理好。将SW3增加一个密码54321的用户qwe

等SW3配置好了之后,还没有要到写python代码的时候,我们还需要在python代码的目录下增加一个JSON文件(switches.json)新建txt文件,重命名就好。输入你要登录的设备相应的参数,这样我们写python代码的时候,就可以直接引用这个文件

展开代码
[ { "name": "SW-ssh", "connection": { "device_type": "huawei", "host": "192.168.88.11", "username": "ren", "password": "12345" } }, { "name": "SW3", "connection": { "device_type": "huawei", "host": "192.168.88.12", "username": "qwe", "password": "54321" } } ]

python代码

展开代码
import json from netmiko import ConnectHandler with open("switches.json") as f: devices = json.load(f) for device in devices: with ConnectHandler(**device['connection']) as conn: hostname = device['name'] print(f'已经成功登录交换机{hostname}') output = conn.send_command('display cur | i sysname') print(output)

讲解

​ 利用open打开switches.json文件,得到设备的参数,然后通过循环轮流登录设备,并输出设备名称

运行结果

批量登录IP地址不连续的设备

​ 同样的,你也会碰到地址不连续的设备,这时候可以怎么做?上面是通过打开json文件来解决,这里则比较简单了,直接引入一个写满我们要登录的设备IP地址的txt文件,然后也是通过循环来遍历登录每一台设备

​ 当然我们的设备还是需要更改一下IP地址,让他不连续,将SW3的192.168.88.12/24更改为192.168.88.15/24

​ 然后我们在python代码文件旁边创建一个ip_list.txt文件,里面放我们的IP地址

python代码

展开代码
import paramiko import time from getpass import getpass username = input('Username: ') password = getpass('password: ') f = open("ip_list.txt", "r") for line in f.readlines(): 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, look_for_keys=False) print ("Successfully connect to ", ip) remote_connection = ssh_client.invoke_shell() remote_connection.send('dis int vlan 1\n') time.sleep(1) output = remote_connection.recv(65535) print (output.decode("ascii")) f.close() ssh_client.close()

讲解

​ 这里值得注意的是,我们在代码里隐藏了用户和密码,将这个转为命令行输入,且隐藏输入,增加了安全性

运行结果

​ 最后,本文介绍了如何使用 Python 自动登录远程华为设备,并执行配置命令。我们使用了 Telnet、SSH 和 Paramiko 库来实现这一功能,并展示了如何通过 JSON 文件批量登录不同用户名和密码的设备。

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!