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

目录

拓扑
通过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 许可协议。转载请注明出处!