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

如何用Python结合用户名、密钥短语和密钥将SFTP文件下载至Azure Blob

使用Python通过密钥短语+密钥从SFTP下载文件到Azure Blob

前置准备

  • 安装所需依赖包:
    pip install pysftp azure-storage-blob
    
  • 准备好以下信息:
    • SFTP服务器地址、端口、用户名
    • SFTP私钥文件路径(如~/.ssh/id_rsa)及对应的密钥短语
    • Azure存储账户的连接字符串、目标Blob容器名称

完整实现代码

import pysftp
from azure.storage.blob import BlobServiceClient
from io import BytesIO

# SFTP配置
SFTP_HOST = 'test.rebex.net'
SFTP_PORT = 22
SFTP_USERNAME = 'demo'
SFTP_PRIVATE_KEY_PATH = '/path/to/your/private/key'  # 替换为你的私钥路径
SFTP_KEY_PASSPHRASE = 'your-key-passphrase'  # 替换为你的密钥短语
SFTP_REMOTE_FILE_PATH = '/path/to/remote/file.txt'  # 替换为SFTP上的目标文件路径

# Azure Blob配置
AZURE_CONNECTION_STRING = 'your-azure-storage-connection-string'  # 替换为你的存储连接字符串
AZURE_CONTAINER_NAME = 'your-container-name'  # 替换为目标容器名称
AZURE_BLOB_NAME = 'target-blob-name.txt'  # 替换为要保存的Blob名称

def transfer_sftp_to_azure_blob():
    sftp_conn = None
    blob_service_client = None
    try:
        # 1. 建立SFTP连接(使用私钥+密钥短语)
        cnopts = pysftp.CnOpts()
        # 生产环境建议保留主机密钥验证,若需跳过可设置cnopts.hostkeys = None
        sftp_conn = pysftp.Connection(
            host=SFTP_HOST,
            port=SFTP_PORT,
            username=SFTP_USERNAME,
            private_key=SFTP_PRIVATE_KEY_PATH,
            private_key_passphrase=SFTP_KEY_PASSPHRASE,
            cnopts=cnopts
        )
        print("SFTP连接成功")

        # 2. 读取SFTP文件到内存流
        file_stream = BytesIO()
        sftp_conn.getfo(SFTP_REMOTE_FILE_PATH, file_stream)
        file_stream.seek(0)  # 重置流指针到开头
        print("已从SFTP读取文件到内存")

        # 3. 上传内存流到Azure Blob
        blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
        blob_client = blob_service_client.get_blob_client(container=AZURE_CONTAINER_NAME, blob=AZURE_BLOB_NAME)
        blob_client.upload_blob(file_stream, overwrite=True)
        print("文件已成功上传到Azure Blob")

    except Exception as e:
        print(f"操作失败: {str(e)}")
    finally:
        # 关闭连接释放资源
        if sftp_conn and not sftp_conn.is_closed:
            sftp_conn.close()
            print("SFTP连接已关闭")
        if blob_service_client:
            blob_service_client.close()

if __name__ == "__main__":
    transfer_sftp_to_azure_blob()

关键说明

  • SFTP密钥连接:通过private_key指定私钥文件路径,private_key_passphrase传入密钥短语,替代原代码的密码验证方式,更安全。
  • 内存流传输:使用BytesIO将文件读取到内存,无需写入本地磁盘,适合无本地存储的服务器环境,提升传输效率。
  • Blob上传控制:upload_blob的overwrite=True参数会覆盖同名Blob,若不需要覆盖可删除该参数,上传重复文件时会抛出错误。
  • 资源清理:通过finally块确保SFTP和Azure连接被正确关闭,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:15:11