使用paramiko跨服务器传输文件/文件夹

一些概念
SSH (Secure Shell)
安全外壳协议,是建立在应用层基础上的安全协议,专为远程登录和其他网络服务提供安全性的协议。
SFTP
SSH 文件传输协议 (Secret File Transfer Protocol, SFTP, 安全文件传送协议) 是一种数据流连接,提供文件访问、传输和管理功能的网络传输协议。

SSHClient 类似于Linux 的 ssh 命令,是对 SSH 会话的封装,该类封装了 传输(Transport),通道(Channel)及 SFTPClient 建立的方法(open_sftp)。
SFTPClient 类似于 Linux 的 sftp 命令,是对 SFTP 客户端的封装,用以实现远程文件操作,如上传、下载、修改文件权限。

Paramiko 基础名词
Channel:是一种类 Socket,一种安全的 SSH 传输通道;
Transport:是一种加密会话,使用时会同步创建一个加密的 Tunnels,这个 Tunnels 叫做 Channel;
Session:是 Client(客户机程序) 与 Server(服务器) 保持连接的对象,用 connect()/start_client()/start_server()开始会话。

Paramiko 基本使用

  1. SSHClient常用的方法介绍
    (1) connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。
    常用参数
    hostname 连接的目标主机
    port=SSH_PORT 指定端口
    username=None 验证的用户名
    password=None 验证的用户密码
    pkey=None 私钥方式用于身份验证
    key_filename=None 一个文件名或文件列表,指定私钥文件
    timeout=None 可选的tcp连接超时时间
    allow_agent=True, 是否允许连接到ssh代理,默认为True 允许l
    ook_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
    compress=False, 是否打开压缩
    (2) set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:
    设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
    AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
    WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
    RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
    (3) exec_command():在远程服务器执行Linux命令的方法。
    (4) open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

来自 https://developer.51cto.com/art/201910/604700.htm

# 需先安装两个模块
# conda install -c conda-forge paramiko
# conda install -c conda-forge scp
import paramiko
from scp import SCPClient
 
# 建立 SSH 连接
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.1.1x', port=22, username='name', password='1234567')
# SCPClient 使用 paramiko 传输作为参数
scp = SCPClient(ssh.get_transport())

# 从远端下载 TESTdir 及其所含内容 到 当前主机路径下
scp.get('/home/remote_path/TESTdir', '/home/local_path/', recursive=True)
# 上传 excel2 及所含内容 到 远端主机目录下
scp.put('/home/local_path/excel2', '/home/remote_path/TESTdir', recursive=True)
# 故第一个 path = 要操作的文件/文件夹所在路径
# 第二个 path = 文件/文件夹要去向的地方
scp.close()
ssh.close()

More: https://pypi.org/project/scp/

注:如果要像官网例子中将 recursive=True 置于中间,在实际操作中将会报错如下:
SyntaxError: positional argument follows keyword argument

加个例子
https://blog.csdn.net/dadajuan_plus/article/details/106383296?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值