使用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
相关产品推荐
相关产品推荐

