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

使用Python pysftp通过.ppk密钥连接SFTP时提示无效DSA私钥文件

解决pysftp连接SFTP时的.ppk密钥错误问题

错误原因

你遇到的SSHException: not a valid DSA private key file错误,本质是pysftp依赖的paramiko库不支持PuTTY格式的.ppk密钥,它仅兼容OpenSSH标准格式的私钥。你的.ppk是PuTTY生成的SSH-RSA密钥,需要转换格式或通过专门方法读取。

解决方案

方案1:将.ppk转换为OpenSSH格式(推荐)

用PuTTYgen工具完成转换:

  • 打开PuTTYgen,点击「Load」选择你的.ppk文件
  • 加载成功后,点击「Conversions」→「Export OpenSSH key」,保存为新的私钥文件(比如命名为id_rsa)
  • 修改代码中的密钥路径为转换后的文件路径

修改后的连接代码:

import pysftp

cnopts = pysftp.CnOpts()
# 注意:生产环境请勿禁用主机密钥验证,建议配置known_hosts文件
cnopts.hostkeys = None

HOST = '你的主机地址'
USERNAME = '你的用户名'
PRIVATE_KEY = '转换后的OpenSSH私钥路径'
PORT = 1111

# 使用with语句自动管理连接生命周期
with pysftp.Connection(host=HOST, 
                       username=USERNAME, 
                       private_key=PRIVATE_KEY, 
                       port=PORT,
                       cnopts=cnopts) as srv:
    # 验证连接成功,列出目录内容
    data = srv.listdir()
    for item in data:
        print(item)

方案2:直接读取.ppk文件(无需转换)

通过第三方库putty解析.ppk文件,先安装依赖:

pip install putty

然后修改代码如下:

import pysftp
from putty import PPK

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

HOST = '你的主机地址'
USERNAME = '你的用户名'
PPK_FILE = 'file.ppk'
PORT = 1111

# 读取并转换.ppk密钥为paramiko兼容格式
ppk = PPK.from_file(PPK_FILE)
private_key = ppk.as_paramiko_rsa_key()

with pysftp.Connection(host=HOST, 
                       username=USERNAME, 
                       private_key=private_key, 
                       port=PORT,
                       cnopts=cnopts) as srv:
    data = srv.listdir()
    for item in data:
        print(item)

注意事项

  • 生产环境中不要禁用主机密钥验证(cnopts.hostkeys = None),建议将服务器的公钥添加到本地known_hosts文件,让pysftp自动验证,避免中间人攻击风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:27:28