paramiko - "不是有效的OpenSSH/RSA/...私钥"错误

Wes*_*Gun 2 paramiko ssh-keys

当我使用时paramiko 2.4.0,我继续收到这样的错误:

SSHException: not a valid OPENSSH private key file
Run Code Online (Sandbox Code Playgroud)

虽然我可以使用钥匙到ssh机器,并且可以访问遥控器.

密钥由以下方式生成:

ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)

然后我将公钥复制到远程机器:(路径也可以是私钥,它是一样的)

ssh-copy-id -i /path/to/public/key root@remote_host
Run Code Online (Sandbox Code Playgroud)

为什么?

Wes*_*Gun 8

事实证明,在检测关键错误的机制paramiko是... 太简单,有时天真.如#340#387所示,存在一些已知问题.

最后证明它不是钥匙的问题; 消息令人困惑.用户名/权限/复制的问题.

paramiko将尝试使用您在密钥中使用的用户登录,因为它假定用户也存在于远程计算机上.但我认为这种逻辑是错误的,因为基本上当你使用加密登录时,你不需要用户名; 你有私钥,服务器有公钥,这就是它所需要的.

想象一下这种情况:你用Windows生成一个密钥,而你在john这里,你的公钥将john@myhostauthorized_keys文件中.当你connect()没有时username,你实际上是john在另一台可能没有这个用户的Linux机器上登录.如果你在Linux上,那就更好了,因为如果你生成密钥root,在另一台机器上也有root,并且root可能对公钥文件拥有正确的权限.

所以,最后,我能够通过以下方式解决问题:

  • 在远程计算机中,检查authorized_keys文件以消除任何重复的行user@host.
  • 生成公钥后,更改它,user使其成为远程计算机上的有效用户.是的,这似乎很奇怪,但它是如何paramiko工作的.然后将其复制到远程.
  • 在调用时connect(),将usernamearg 传入与您放入公钥的用户名相同.
  • 确保您在公钥中使用的用户对该authorized_keys文件及其父.ssh文件夹具有权限.至少r许可.