我正在尝试使用以下Spinet连接到服务器
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ip = ['x.x.x.x']
key_file = "/Users/user/.ssh/id_rsa"
key = paramiko.RSAKey.from_private_key_file(key_file)
ssh.load_system_host_keys()
ssh.connect(ips, port=22, username='XYZ', pkey=key, timeout=11)
但是我有一个错误,不是有效的RSA私钥文件
我面临以下错误
答案 0 :(得分:8)
OpenSSH的最新版本(7.8及更高版本)默认情况下会以 new OpenSSH格式生成密钥,其开头为:
-----BEGIN OPENSSH PRIVATE KEY-----
仅从version 2.7.1 (2019-12-09)开始,Paramiko完全支持该格式。
如果您使用的是Paramiko的旧版本,则可以使用ssh-keygen
将密钥转换为经典 OpenSSH格式:
ssh-keygen -p -f file -m pem -P passphrase -N passphrase
(如果密钥未使用密码加密,请使用""
代替passphrase
)
对于Windows用户:请注意,ssh-keygen.exe
现在内置在Windows 10中。对于旧版本的Windows,可以是downloaded from Microsoft Win32-OpenSSH project。
在Windows上,您还可以使用PuTTYgen(来自PuTTY package):
如果要使用ssh-keygen
创建新密钥,只需添加-m PEM
即可以经典格式生成新密钥:
ssh-keygen -m PEM
答案 1 :(得分:2)
我遇到了类似的情况,而ssh-keygen帮助了我。您应该复制id_rsa并使用ssh-keygen将其转换为RSA类型。
要将“ BEGIN OPENSSH私钥” 转换为“ BEGIN RSA私钥”
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
答案 2 :(得分:0)
paramiko.RSAKey.from_private_key_file
方法要求私钥文件为“ PEM”格式。检查您要读取的文件,并查看文件是否以以下一行开头:
-----BEGIN RSA PRIVATE KEY-----
如果没有该行,则不是PEM。
如果不是PEM,则必须找到某种方法来创建私钥的PEM版本。 (编辑:原始发布者使用PuTTY的puttygen
实用程序将私钥导出为PEM格式的文件。)
请确保新文件具有与原始id_rsa
文件相同的所有权和有限的访问权限,以便没有人可以通过读取文件来窃取密钥。然后,显然,修改您的paramiko
调用以从新的PEM格式文件中读取密钥。
答案 3 :(得分:0)
我在使用 ssh 连接到 Ubuntu VM 时遇到了同样的错误。
在我的终端 SSH_AUTH_SOCK
环境变量未定义,paramiko 抛出 not a valid RSA private key file
错误。
但是,如果我在图形会话中连接到同一台机器,则图形终端已定义 SSH_AUTH_SOCK
,Paramiko 很高兴。
作为一种解决方法,我在 SSH 终端中复制了 SSH_AUTH_SOCK
的内容,效果更好。