SSH、SFTP、Netconf
目录
实验需求:
1 编写程序,通过SSH和SFTP连接CE12800设备。
2 运行设备查询信息,下载设备配置文件,将文件保存在本地。
3 通过Netconf下发配置到接口G1/0/2。
实验拓扑:
过程思路:
1 实验设备准备SSH、SFTP、Neconf的CLI配置。
2 编写python代码。
具体步骤:
-
1(CLI)
rsa local-key-pair create
aaa
local-user huawei password cipher Ruijie@123
local-user huawei service-type ssh
local-user huawei level 3
quit
user-interface vty 0 4
authentication-mode aaa
protocol inbound ssh
quit
ssh user huawei authentication-type password
stelnet server enable
ssh user haweui service-type all
ssh user huawei sftp-directory cfcard:
sftp server enable
netconf
protocol inbound ssh port 830
quit
-
2(Python)
# -*- coding: utf-8 -*-
# 定义NetConf操作的常量,用于后续的NETCONF操作
from ncclient import manager
from ncclient import operations
#导入所需要的模块
import paramiko # 用于完成SSH功能的模块
import time # 提供时间等待功能的模块
# 设备参数
ip = '192.168.0.88' # 设备IP地址
port = '830' # NetConf端口,默认为830
user = 'huawei' # 登录用户名
password = 'Ruijie@123' # 登录密码
filename = 'cmd.txt' # 配置文件名,用于读取配置命令
####################################################### SSH
# 定义一个名为HCIE的类,用于自动化SSH和SFTP操作
class HCIE:
# 初始化方法,创建一个SSH连接并设置shell
def __init__(self):
self.ssh_inst = self.ssh_conn() # 创建SSH连接
self.shell = self.ssh_inst.invoke_shell() # 打开shell
self.send_cmd('screen-length 0 temporary\n') # 禁用命令历史记录
# 创建SSH连接的方法
def ssh_conn(self):
ssh_inst = paramiko.SSHClient() # 创建一个SSH客户端对象
ssh_inst.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) # 设置自动添加主机密钥策略,以避免连接错误
ssh_inst.connect(hostname=ip, # 连接到指定的主机地址和端口
username=user, # 使用指定的用户名进行连接
password=password) # 使用指定的密码进行连接
return ssh_inst # 返回SSH客户端对象
# 关闭SSH连接的方法
def ssh_close(self, ssh_inst):
ssh_inst.close() # 关闭SSH连接
# 发送命令到shell并返回结果的方法
def send_cmd(self, cmd):
self.shell.send(cmd) # 将命令发送到shell
time.sleep(1) # 等待1秒,确保命令已发送完毕
return self.shell.recv(9999).decode() # 从shell接收数据,解码并返回结果
####################################################### SFTP
# 定义一个操作函数,执行一系列任务
def operation():
rcie = HCIE() # 创建一个rcie对象,用于自动化SSH和SFTP操作
with open(filename) as f: # 打开名为filename的文件,其中包含要执行的命令列表
cmd_list = f.readlines() # 将文件中的命令读取为列表,每个命令占一行
for cmd in cmd_list: # 对于文件中的每个命令
result = rcie.send_cmd(cmd) # 使用rcie对象的send_cmd方法发送命令,并获取结果
print(result) # 打印结果到控制台
rcie.send_cmd('save\ny\n') # 发送保存命令到交换机,并确认保存操作
rcie.ssh_close(rcie.ssh_inst) # 关闭当前的SSH连接,释放资源
new_ssh = rcie.ssh_conn() # 重新创建一个新的SSH连接,因为之前的连接已被关闭
sftp_inst = new_ssh.open_sftp() # 使用新的SSH连接打开SFTP会话
sftp_inst.get('/vrpcfg.cfg', 'config_back.cfg') # 从交换机获取配置文件并保存到本地文件config_back.cfg中
rcie.ssh_close(new_ssh) # 关闭SFTP会话和SSH连接,释放资源
if __name__ == "__main__": # 确保这段代码只在直接运行时执行,而不是作为模块导入时执行
operation() # 调用operation函数,执行自动化操作任务
####################################################### Netconf
# 定义函数huawei_connect,用于建立NETCONF连接
def huawei_connect(host, port, user, password):
# 使用ncclient的manager模块来建立NETCONF连接
return manager.connect(host=host, # 设备IP地址或主机名
port=port, # 连接的端口,默认为830
username=user, # 登录用户名
password=password, # 登录密码
hostkey_verify=False, # 禁用主机密钥验证,这里设置为False是为了简化代码,实际生产中应启用主机密钥验证
device_params={'name': "huawei"}, # 指定设备类型为华为,这会影响连接过程中的一些行为和参数设置
allow_agent=False, # 禁用NETCONF agent,设置为False表示不使用NETCONF agent
look_for_keys=False) # 禁用密钥查找,设置为False表示不自动查找密钥
# NETCONF发送XML数据,配置设备接口IP地址
CREATE_INTERFACE = '''<config>
<ethernet xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
<ethernetIfs>
<ethernetIf operation="merge">
<ifName>GE1/0/2</ifName>
<l2Enable>disable</l2Enable>
</ethernetIf>
</ethernetIfs>
</ethernet>
<ifm xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0">
<interfaces>
<interface operation="merge">
<ifName>GE1/0/2</ifName>
<ifDescr>Config by NETCONF</ifDescr>
<ifmAm4>
<am4CfgAddrs>
<am4CfgAddr operation="create">
<subnetMask>255.255.255.0</subnetMask>
<addrType>main</addrType>
<ifIpAddr>192.168.2.1</ifIpAddr>
</am4CfgAddr>
</am4CfgAddrs>
</ifmAm4>
</interface>
</interfaces>
</ifm>
</config>'''
# 主函数,顺序执行
if __name__ == '__main__': # 判断是否是直接运行此脚本,如果是则执行以下代码
# 调用huawei_connect函数,建立NETCONF连接
m = huawei_connect(ip, port, user, password)
# 通过NETCONF连接对象m,执行编辑配置的操作,目标是运行中的配置,并传入要应用的配置CREATE_INTERFACE
m.edit_config(target='running', config=CREATE_INTERFACE)
结果验证:
终端工具SSH远程登录测试
python运行代码
dir命令查看备份效果
查看备份文件
查看G1/0/2的配置
总结:本人立志做一个内容丰富且免费的专栏,如果本篇文章能够帮助到你,麻烦点赞加收藏。如有不足之处请私信或者评论告诉博主,谢谢!