sshtunnel无法识别私钥密码

2024-09-28 21:38:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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代理存储的对话框中输入私钥密码,然后运行上面的代码,就可以正常工作了。

如果我在运行代码之前没有登录到服务器,我会收到这个错误:ValueError: No password or public key available!(但是密码在那里-ssh_private_key_password-no?)

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

这里会发生什么?我是不是对SSHTunnelForwarder的预期论点有些误解?关于密钥和密码的一些更基本的东西?


Tags: key代码服务器密码远程servermypassword
3条回答

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

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

也许您应该添加私钥

ssh-add ~/.ssh/id_rsa

我已经解决了这个问题。

在我的例子中,我的macOS ~/.ssh/id_rsa-----BEGIN OPENSSH PRIVATE KEY-----开始,这不是正确的开始行。

实际上,ssh_pkey应该从-----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.PKey,这意味着~/.ssh/id_rsa应该正确地转换为paramiko.pkey。

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

因此,我在linux操作系统中生成一个新的密钥,命令是ssh-keygen -t rsa,然后 我使用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

现在linux操作系统上的~/.ssh/id_rsa看起来像:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuFSEXjLMwyAJ54d5hQQjyIE+4l5pZw7GuYFDgNCzXjl6CNwV
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
-----END RSA PRIVATE KEY-----

把它复制到我的本地mac,然后测试它。

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.

现在,它毫无例外地工作。

with SSHTunnelForwarder(
        ('jump_server_host', jump_ssh_port),  # jump server
        ssh_username='username',
        ssh_pkey="/path/to/new/id_rsa",
        remote_bind_address=('remote_host', remote_ssh_port),  # remote_server
        local_bind_address=('0.0.0.0', 30023)                  # local_bind_port set to 30023, your can select new one 
) as server:
    server.start()
    print(server.local_bind_port)
    server.close() 

它输出30023

相关问题 更多 >