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

