拓扑搭建:
环境搭建:
注意这里的云连接的是19.1这个网段,所以交换机SW1也要配置到同一个网段
sw1:
配置IP,划分vlan:
[sw1]vl 100
[sw1]int vlan 100
[sw1-Vlanif100]ip add 192.168.19.10 24
[sw1]int g0/0/1
[sw1-GigabitEthernet0/0/1]po li ac
[sw1-GigabitEthernet0/0/1]po de vl 100交换机部署ssh:
[sw1]stelnet server enable # 启动ssh服务的远程登录功能
[sw1]ssh user zhangxiong # 新建SSH用户
[sw1]ssh user zhangxiong authentication-type password # 配置ssh用户密码认证方式
[sw1]ssh user zhangxiong service-type stelnet # 配置ssh用户的服务方式为远程登录
# 开放 vty 端口,能被远程登录
# 开放 编号为 0 1 2 3 4 的 vty端口,同时支持五个远程用户连接
# 认证模式为 aaa---> authentication 认证(谁能登录进来)
# ---> authorizathon 授权(谁进来能干什么)
# ---> according 审计(谁进来干了什么)[sw1]user-interface vty 0 4
[sw1]authentication-mode aaa
[sw1]protocol inbound ssh # 登入协议为ssh
# 三A认证配置
[sw1]aaa
[sw1-aaa]local-user zhangxiong password cipher huawei@123 # 配置本地账号的登录口令
[sw1-aaa]local-user zhangxiong privilege level 15 # 配置账号登录后的管理级别,15最高
[sw1-aaa]local-user zhangxiong service-type ssh # 配置本地用户的接入类型
这时基础配置就完成了,主要是在sw1上开启了ssh服务并配置了账号和密码验证,然后配置远程登录,从而可以实现用python进行连接sw1。接下来开始正题:
python代码解析:
# display current-configuration 查看当前的配置
# display saved-configuration # 查看当前保存的配置
# display current-configuration | include ip route 筛选配置过的ip route命令
import paramiko
import time
# 创造一个 SSH 客户端
ssh_client = paramiko.SSHClient() # 创建一个ssh客户端对象
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
"""
AutoAddPolicy:自动添加主机名以及主机秘钥
set_missing_host_key_policy:一个连接主机的策略(没有本地主机秘钥或者HostKeys对象时)
"""
ssh_client.connect(hostname='192.168.19.10', username='zhangxiong', password='huawei@123')
# 连接sw1,用户名密码为sw1中远程登录设置的
command = ssh_client.invoke_shell()
# 打开连接到的终端,使用ssh shell通道,相当于使用ssh远程到了sw1
# 给设备 发送命令
"""
send发送内容,然后将字符串进行编码,以便让计算机认识
"""
command.send("sys\n".encode()) # 进入系统视图,\n表示在终端执行回车操作
command.send("user-interface vty 0 4\n".encode())
command.send("screen-length 0\n".encode())
"""
这里这样配置是因为执行dis cu 后会显示不完整,只会显示默认的24行,然后需要我们自己
去按回车或者空格,才能进行翻页,会导致我们在python中回显只能看到前面24行。
这里是进入了远程登录视图,设置了荧幕长度为0,0表示显示所有行
"""
command.send("dis cu\n".encode()) # 发送dis cu 命令并编码
time.sleep(3) # 需要进行睡眠,以便让下一条接收响应的命令能够有时间回显
recv = command.recv(65535).decode() # recv接收响应,字节为65535,并进行解码
result = recv.splitlines()
# result现在是一个列表,存放了回显的命令,每个命令是一个元素
"""
splitlines:splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
这样做是因为在保存文件后发现每行命令后多出一行空行
"""
print(recv)
# 将回显内容保存到本地
with open("sw1.txt", 'w') as back:
for item in result:
print(item)
back.write(item+"\n")
ssh_client.close()
执行完成后在脚本本地会多出一个sw1.txt的文件存放了dis cu后回显的内容