You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现AWS S3文件直接复制到SFTP服务器(无需本地下载)?

将AWS S3文件直接复制到SFTP服务器(无需本地存储)

所需依赖

先安装必要的Python库:

pip install boto3 paramiko

实现思路

核心是流式传输:直接从S3获取文件的字节流,通过SFTP客户端将数据流实时写入远程服务器,全程不生成本地临时文件。具体流程:

  • 初始化S3客户端并获取目标文件的流式对象
  • 建立SFTP连接
  • 打开远程SFTP服务器的写入流,将S3的数据流直接写入

完整可运行代码示例

import boto3
import paramiko
from paramiko.sftp_client import SFTPClient

def s3_to_sftp(
    s3_bucket: str,
    s3_file_key: str,
    sftp_host: str,
    sftp_port: int,
    sftp_username: str,
    sftp_password: str = None,
    sftp_private_key_path: str = None,
    remote_file_path: str = None
):
    # 默认远程文件名和S3文件键的末尾文件名一致
    if not remote_file_path:
        remote_file_path = s3_file_key.split('/')[-1]

    # 初始化S3客户端(推荐用IAM角色或环境变量认证,避免硬编码密钥)
    s3_client = boto3.client('s3')
    # 获取S3文件的流式对象
    s3_object = s3_client.get_object(Bucket=s3_bucket, Key=s3_file_key)
    file_stream = s3_object['Body']

    # 建立SFTP连接
    transport = paramiko.Transport((sftp_host, sftp_port))
    try:
        # 认证方式:密码或私钥二选一
        if sftp_password:
            transport.connect(username=sftp_username, password=sftp_password)
        elif sftp_private_key_path:
            private_key = paramiko.RSAKey.from_private_key_file(sftp_private_key_path)
            transport.connect(username=sftp_username, pkey=private_key)
        else:
            raise ValueError("必须提供SFTP密码或私钥路径")

        # 创建SFTP客户端并传输文件
        with SFTPClient.from_transport(transport) as sftp:
            # 分块传输,避免大文件占用过多内存
            chunk_size = 1024 * 1024  # 1MB分块
            with sftp.file(remote_file_path, 'wb') as remote_file:
                while True:
                    chunk = file_stream.read(chunk_size)
                    if not chunk:
                        break
                    remote_file.write(chunk)
        print(f"文件 {s3_file_key} 已成功复制到SFTP服务器的 {remote_file_path}")
    finally:
        # 确保连接关闭
        if transport.is_active():
            transport.close()

# 示例调用(替换为你的实际参数)
if __name__ == "__main__":
    s3_to_sftp(
        s3_bucket="your-s3-bucket-name",
        s3_file_key="path/to/your/s3/file.txt",
        sftp_host="your-sftp-host.com",
        sftp_port=22,
        sftp_username="your-sftp-username",
        # 二选一:密码或私钥路径
        # sftp_password="your-sftp-password",
        sftp_private_key_path="/path/to/your/private/key",
        remote_file_path="remote/path/for/file.txt"  # 可选,默认用S3文件名
    )

关键细节说明

  • AWS认证最佳实践:不要在代码中硬编码AWS密钥,推荐使用:
    • 本地环境:配置~/.aws/credentials文件
    • AWS云服务(EC2/EKS等):使用IAM角色自动认证
    • 环境变量:设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
  • SFTP安全认证:优先使用SSH私钥认证,避免明文密码传输
  • 大文件处理:1MB分块传输的逻辑可以避免一次性加载大文件到内存,适合处理GB级文件
  • 生产环境优化:建议添加更多异常捕获(如S3权限不足、SFTP连接超时、磁盘空间不足等),提升代码健壮性

内容的提问来源于stack exchange,提问作者abhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:55:28