python自动登录远程设备的几种方式(华为设备)

发布于:2025-04-09 ⋅ 阅读:(85) ⋅ 点赞:(0)

        其实登录远程设备(交换机路由器)的方式无非就是通过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 文件批量登录不同用户名和密码的设备。


网站公告

今日签到

点亮在社区的每一天
去签到