背景
我们知道用Python在cli配置网络设备的前提是:
- 网络设备与Python主机网络可达
- 网络设备已开启并完成ssh相关配置
目标
本文已华为S5720S-52P-LI-AC交换机为例,完成:
- 完成网络设备开局配置;
- 用Python脚本验证ssh登录
配置
一、网络设备开局配置
如果之前配置杂乱,建议console登录之后首先在用户视图下用reset saved-configuration删除配置,然后重启设备,如未重启原配置仍然生效;如果是新设备可直接进行开局配置。
1、console线连接
2、默认账户登录
交换机默认用户名admin 密码admin@huawei.com
路由器默认用户名admin 密码Admin@huawei
3、配置设备名称(可选)
#进入系统视图
system view
#重命名设备为XXX
sysname xxx
4、配置时区时间(可选)
#配置时区
clock timezone Beijing add 08:00:00
#配置时间
clock datatime 19:00:00 2024-03-06
#查看配置
dis clock
5、配置管理接口及IP
执行ip address命令,配置设备管理IP地址,执行命令ip route-static,配置设备缺省网关。
-
5.1、对于有管理网口的设备,在管理网口下配置管理IP地址
int gi 0/0/0
ip address 192.168.99.1 24 //设备管理IP
q
ip route-static 0.0.0.0 0.0.0.0 192.168.99.1 //设备缺省网关
-
5.2、对于没有管理网口的设备,在vlanif接口下配置管理IP地址
sys
vlan 99
q
int vlanif 99
ip add 192.168.99.1 24 //设备管理IP
q
ip route-static 0.0.0.0 0 192.168.99.1 //设备缺省网关
由于本文是准备将Python主机直接与S5720交换机SSH连接,所以需要将其中某个接口配置到管理接口下
int gi 0/0/1
p l a //全写是port link-type access
p d v 99 //全写是port default vlan 99
6、配置VTY
sys
user-int vty 0 4
authentication-mode aaa //配置VTY用户认证方式为AAA认证
protocol inbound ssh //VTY用户界面所支持的协议缺省为ssh
q
7、配置AAA
注意:一般情况下ssh用户很多都用admin,但是出于安全性考虑,最好设置为非系统默认用户
sys
aaa
local-user python password irreversible-cipher python@network
local-user python service-type ssh terminal
local-user python privilege level 15
q
8、创建SSH用户(可选)
sys
ssh user python
ssh user python authentication-type password
ssh user python service-type stelnet
由于VTY默认采用AAA里配置的用户且支持ssh,所以可以不用再创建SSH用户
9、开启SSH服务
stelnet server enable
二、用Python脚本验证ssh登录
1、通过paramiko模块ssh登录设备,并执行dis ip int b命令之后返回结果
2、代码
import paramiko
import time
# 创建ssh客户端
ssh = paramiko.SSHClient()
# 自动添加主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接到远程服务器
ssh.connect('192.168.99.1',username='python',password='python@network')
# 参数说明:
# allow_agent:是否允许使用代理验证,默认为False
# look_for_keys:是否在本地寻找私钥文件,默认为False
# 执行命令
cli=ssh.invoke_shell()
cli.send('screen-length 0 temporary\n')
cli.send('dis ip int b\n')
time.sleep(3)
dis_cu = cli.recv(999999).decode()
print(dis_cu)
# stdin,stdout,stderr = client.exec_command('ls -l')
# print(stdout.read().decode())
# 关闭连接
# client.close()