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