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

更换Debian10虚拟机后pysftp连接服务器报Bad host key错误如何解决

问题原因

Debian 10内置的OpenSSH 8.x版本默认禁用了基于SHA-1哈希的ssh-rsa主机密钥算法,服务端默认优先返回ssh-ed25519、ecdsa-sha2-nistp256等安全性更高的主机密钥。你原有代码中固定配置的是ssh-rsa类型的主机公钥校验规则,和服务端实际返回的密钥类型不匹配,因此触发SSHException: Bad host key from server报错。

解决方案

方案1(推荐):适配Debian 10默认的密钥类型

  • 登录目标Debian 10服务器,执行命令ssh-keyscan -t ed25519 你的服务器地址,获取输出内容中ssh-ed25519 后的公钥字符串,替换原有环境变量中存储的RSA公钥值
  • 修改代码中的密钥加载逻辑,匹配ed25519密钥类型,修改后完整代码如下:
from base64 import decodebytes
import os
import pysftp 
import paramiko

host = os.getenv('host')
username = os.getenv('username')
password = os.getenv('password')

# 加载ed25519类型主机公钥
keydata = bytes(os.getenv('key'),'UTF-8')
key = paramiko.Ed25519Key(data=decodebytes(keydata))
cnopts = pysftp.CnOpts()
# 主机密钥类型同步修改为ssh-ed25519
cnopts.hostkeys.add(host,'ssh-ed25519', key)

with pysftp.Connection(host=host, username=username, password=password, cnopts=cnopts, port=22) as sftp:
    sftp.cwd('/home/user/') 
    for attr in sftp.listdir(): 
        print(attr)

如果服务器默认返回的是ecdsa类型密钥,对应把密钥类型换成ecdsa-sha2-nistp256、加载类换成paramiko.ECDSAKey即可。

方案2(不推荐):在服务端重新开启ssh-rsa支持

如果需要兼容原有RSA密钥配置,可以手动修改Debian 10的SSH服务配置放开ssh-rsa算法限制:

  • 登录服务器编辑配置文件/etc/ssh/sshd_config,新增配置行:HostKeyAlgorithms +ssh-rsa
  • 执行命令systemctl restart sshd重启SSH服务生效,原有代码无需修改即可正常连接。

注意:严禁为了省事直接设置cnopts.hostkeys = None跳过主机密钥校验,该配置会完全禁用服务端身份验证,存在严重的中间人攻击风险,生产环境禁止使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:06:19