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

如何配置Python pysftp/paramiko连接以指定HostkeyAlgorithms

使用Paramiko实现自定义HostkeyAlgorithm的SFTP自动化传输

我太懂这种卡壳的感觉了——之前用pysftp做批量传输顺手得很,结果碰到需要自定义HostkeyAlgorithm的场景直接哑火,毕竟pysftp封装得太死,很多底层Paramiko的特性都没暴露出来。既然你已经能用sftp -o HostkeyAlgo=...手动搞定,那直接用Paramiko写自动化脚本就完美解决问题了,下面给你一步步来:

核心思路

Paramiko作为pysftp的底层依赖,完全支持配置HostkeyAlgorithm,我们只需要跳过pysftp的封装,直接调用Paramiko的SSHClient和SFTPClient就行。关键就是在connect()方法里指定hostkey_algorithms参数,对应你bash命令里的HostkeyAlgo值。

完整代码示例

import paramiko
from paramiko.ssh_exception import SSHException, NoValidConnectionsError

def sftp_upload_with_custom_hostkey(host, port, username, password, local_file_path, remote_file_path, hostkey_algo):
    ssh_client = paramiko.SSHClient()
    try:
        # 设置主机密钥策略,根据你的需求选择,这里用自动添加(生产环境建议用已知主机文件)
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        
        # 连接服务器,重点在这里指定hostkey_algorithms
        ssh_client.connect(
            hostname=host,
            port=port,
            username=username,
            password=password,
            # 这里传入你需要的主机密钥算法,和bash命令里的HostkeyAlgo值一致
            hostkey_algorithms=hostkey_algo
        )
        
        # 创建SFTP客户端
        sftp_client = ssh_client.open_sftp()
        
        # 上传文件
        sftp_client.put(local_file_path, remote_file_path)
        print(f"文件 {local_file_path} 成功上传到 {remote_file_path}")
        
        # 关闭SFTP连接
        sftp_client.close()
    except NoValidConnectionsError:
        print("无法连接到目标服务器,请检查主机地址和端口")
    except SSHException as e:
        print(f"SSH连接出错: {str(e)}")
    except Exception as e:
        print(f"上传过程中发生错误: {str(e)}")
    finally:
        # 确保SSH客户端关闭
        if ssh_client.get_transport() and ssh_client.get_transport().is_active():
            ssh_client.close()

# 调用示例,替换成你的实际参数
if __name__ == "__main__":
    SFTP_HOST = "你的客户SFTP服务器地址"
    SFTP_PORT = 22
    SFTP_USER = "你的用户名"
    SFTP_PASS = "你的密码"
    LOCAL_FILE = "/本地文件路径/xxx.txt"
    REMOTE_FILE = "/远程服务器路径/xxx.txt"
    # 这里填你bash命令里用的HostkeyAlgo值,比如"ssh-rsa"或者"ecdsa-sha2-nistp256"
    HOSTKEY_ALGO = "ssh-rsa"
    
    sftp_upload_with_custom_hostkey(
        SFTP_HOST, SFTP_PORT, SFTP_USER, SFTP_PASS, LOCAL_FILE, REMOTE_FILE, HOSTKEY_ALGO
    )

关键细节说明

  • hostkey_algorithms参数:这个参数接受一个字符串(单个算法)或者字符串列表(多个算法优先级),和你bash命令里-o HostkeyAlgo=...的值完全对应,比如你手动用的是ssh-rsa,这里就传"ssh-rsa"就行。
  • 主机密钥策略:示例里用的AutoAddPolicy会自动添加未知主机的密钥到本地缓存,如果你是生产环境,建议用RejectPolicy(默认)或者加载已知主机文件ssh_client.load_system_host_keys(),安全性更高。
  • 异常处理:示例里加了常见的连接错误和SSH错误处理,你可以根据自己的业务需求扩展更多异常场景的处理逻辑。

这样写出来的脚本就能完全替代你手动的bash命令,实现自动化传输,而且完美支持自定义HostkeyAlgorithm啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:55:00