如何用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
相关产品推荐
相关产品推荐

