sshtunnel无法识别私钥密码

时间:2016-10-21 03:17:09

标签: python private-key ssh-tunnel ssh-agent

我正在使用sshtunnel连接到远程服务器并从那里连接到数据库。一切都运行正常,除了sshtunnel似乎不能识别我的ssh_private_key_password,除非我已经在其他地方输入了它(或者更可能是我在提供它时犯了错误)。

with SSHTunnelForwarder(
    ('my.server', 22),
    ssh_username="myUsername",
    ssh_pkey="~/.ssh/id_rsa", 
    ssh_private_key_password="myPassword",
    remote_bind_address=("other.server", 3306)
) as server:
{do some stuff}

如果我单独登录“my.server”并在ssh-agent存储的对话框中输入我的私钥密码,然后然后运行上面的代码,它将按预期工作。

如果我在之前的某个时间点运行代码已经登录到服务器,我收到此错误:ValueError: No password or public key available!(但密码在那里 - ssh_private_key_password - 没有?)< / p>

无论ssh_pkey是指向公钥还是私钥,都会发生这种情况。

这里可能会发生什么?我是否误解了SSHTunnelForwarder的预期论点?密钥和密码更基本的东西?

5 个答案:

答案 0 :(得分:2)

也许您应该添加私钥

ssh-add ~/.ssh/id_rsa

答案 1 :(得分:1)

如果您找不到解决方案,在我的情况下,问题是私钥的路径。 而不是使用:

ssh_pkey="~/.ssh/id_rsa",

使用(例如)绝对路径

ssh_pkey="/Users/<your-user>/.ssh/id_rsa",

根据我的分析,问题是检查密钥存在于sshtunnel中: https://github.com/pahaz/sshtunnel/blob/master/sshtunnel.py#L1018

使用os.path.exists(ssh_pkey)路径

时,

~/.ssh/id_rsa为False

答案 2 :(得分:1)

我已经解决了这个问题。

在我的情况下,我的macOS ~/.ssh/id_rsa-----BEGIN OPENSSH PRIVATE KEY-----开头,这不是正确的开始行。

实际上,ssh_pkey应该以{{1​​}}开头。根据{{​​1}}模型的源代码:

-----BEGIN RSA PRIVATE KEY-----

密钥是sshtunnel,这意味着ssh_pkey (str or paramiko.PKey): **Private** key file name (``str``) to obtain the public key from or a **public** key (:class:`paramiko.pkey.PKey`) 应该正确转换为paramiko.pkey。

paramiko.pkey.PKey

因此,我在Linux操作系统上使用~/.ssh/id_rsa命令生成了一个新密钥,然后 我授权使用import paramiko pkey='~/.ssh/id_rsa' key=paramiko.RSAKey.from_private_key_file(pkey) # id_rsa with `-----BEGIN OPENSSH PRIVATE KEY-----` # raise SSHException: not a valid RSA private key file 访问密钥。

ssh-keygen -t rsa

现在我的Linux操作系统上的ssh-copy-id -i ~/.ssh/id_rsa.pub username@jump_server_host -p ssh_port如下:

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub username@jump_server_host -p ssh_port

将其复制到我的本地Mac,然后进行测试。

~/.ssh/id_rsa

现在,它可以正常运行而没有异常-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAuFSEXjLMwyAJ54d5hQQjyIE+4l5pZw7GuYFDgNCzXjl6CNwV XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX -----END RSA PRIVATE KEY-----

pkey='/path/to/the/new/id_rsa'
key=paramiko.RSAKey.from_private_key_file(pkey) 

# id_rsa with `-----BEGIN RSA PRIVATE KEY-----`
# No SSHException now.

它输出ValueError: No password or public key available!

答案 3 :(得分:0)

通过在计算机上运行以下命令,我遇到了类似的问题。我能够解决此问题。

$ssh-add ~/.ssh/id_rsa

答案 4 :(得分:-2)

昨天我遇到了同样的问题。我以前使用的代码效果很好。但是三个月后,它将无法使用“没有可用的密码或公钥”例外。我发现我的paramiko版本是2.5,所以我将其更新为2.7。然后代码可以再次正常工作。