如何正确添加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
相关产品推荐
相关产品推荐

