使用Paramiko连接主机失败:提示不是有效的OPENSSH私钥文件
解决Paramiko无法识别PPK私钥的问题
问题根源:你用的private.ppk是WinSCP/PuTTY专用的私钥格式,Paramiko只支持OpenSSH标准格式的私钥,所以会报「not a valid OPENSSH private key file」错误。
以下是具体解决方法:
方法一:用WinSCP转换私钥格式
- 打开WinSCP,顶部菜单栏选择「工具」→「PuTTYgen」
- 在弹出的PuTTYgen窗口中,点击「加载」,找到并选中你的
private.ppk文件(注意文件类型要选「All Files」才能看到ppk) - 加载成功后,点击「转换」→「导出OpenSSH密钥」,弹出提示时选择「是」(如果不需要密钥密码),将文件保存为
private_openssh.key之类的名称 - 修改脚本中的
key_filename参数,指向这个新生成的OpenSSH格式密钥文件
方法二:单独用PuTTYgen转换
- 如果你已经安装了PuTTY工具包,直接打开PuTTYgen
- 点击「加载」导入
private.ppk,再按上述步骤导出OpenSSH格式密钥即可
额外注意事项
- 在Linux/macOS环境下,新生成的密钥文件权限必须设置为
600,否则会被SSH服务拒绝:chmod 600 private_openssh.key - 如果你的私钥设置了密码,不能直接用
key_filename参数,需要先加载密钥并传入密码,示例代码如下:import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 加载带密码的私钥 private_key = paramiko.RSAKey.from_private_key_file('private_openssh.key', password='你的密钥密码') ssh.connect('hostname.com', username='user', pkey=private_key) stdin, stdout, stderr = ssh.exec_command('ls') print(stdout.readlines()) ssh.close()
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

