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

如何正确添加SSH密钥解决pysftp连接SFTP时主机公钥加载报错问题

pysftp主机密钥校验配置失败解决方法

核心错误原因

  • 路径拼写错误:你所有配置中出现的.shh均为拼写错误,SSH默认配置目录名为.ssh
  • 参数类型错误:CnOpts的knownhosts参数要求传入known_hosts文件的完整路径,你当前传入的是文件夹路径,自然加载失败
  • 密钥用途混淆:你本地生成的projectKey.pub是客户端公钥,用于上传到服务端做免密登录,不是用于主机校验的服务端公钥。主机校验需要使用SFTP服务端的公钥
  • 路径读取错误:调用cnopts.hostkeys.load()时传入相对路径,如果公钥文件不在脚本运行的当前工作目录下,会触发读取失败

正确操作步骤

  • 第一步:修正所有路径的拼写,把.shh统一替换为.ssh
  • 第二步:获取SFTP服务端的主机公钥,打开Windows cmd执行以下命令,服务端公钥会自动写入本地known_hosts文件:
    ssh-keyscan example.host.com >> C:\Users\mposc\.ssh\known_hosts
    注意将example.host.com替换为你实际使用的SFTP服务端地址
  • 第三步:修改代码配置,修正后代码如下:
import pysftp as sftp

# 直接传入known_hosts文件的绝对路径,初始化时会自动加载所有服务端公钥
cnopts = sftp.CnOpts(knownhosts='C:/Users/mposc/.ssh/known_hosts')

def sftpconnect():
    try:
        cnnt = sftp.Connection(host="example.host.com", username="usersample", password="*****", cnopts=cnopts)
        print("connection succesful")
        cnnt.close()
    except Exception as e:
        print(str(e))

sftpconnect()
  • 如果你需要单独加载指定公钥文件,要确保公钥格式符合OpenSSH known_hosts规范(每行结构为主机名 加密算法 公钥内容),传入绝对路径加载即可:
    cnopts.hostkeys.load('C:/Users/mposc/.ssh/known_hosts/projectKey.pub')

备选兼容方案

如果确认是pysftp本身的兼容问题,可以直接使用底层的paramiko库实现,配置更稳定灵活:

import paramiko

transport = paramiko.Transport(('example.host.com', 22))
# 加载本地存储的服务端主机密钥
host_keys = paramiko.HostKeys()
host_keys.load('C:/Users/mposc/.ssh/known_hosts')
transport.connect(username='usersample', password='*****', hostkey=host_keys.lookup('example.host.com'))

sftp = paramiko.SFTPClient.from_transport(transport)
# 此处可执行上传、下载等SFTP操作
print("connection successful")
sftp.close()
transport.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:06:04