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 文件批量登录不同用户名和密码的设备。

相关推荐
大树8817 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠17 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质17 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz18 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工18 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院19 小时前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智19 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest19 小时前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_19 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈19 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix