sshtunnel无法识别私钥密码

use*_*118 5 python ssh-tunnel ssh-agent private-key

我正在使用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}
Run Code Online (Sandbox Code Playgroud)

如果我分别登录“ my.server”,并在对话框中输入我的私钥密码以供ssh-agent存储,然后运行上面的代码,则它可以正常工作。

如果我在未登录服务器的情况下运行代码,ValueError: No password or public key available!则会收到此错误:(但是密码在那里-ssh_private_key_password-否?)

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

这里可能会发生什么?我对SSHTunnelForwarder的预期参数有误解吗?关于密钥和密码更基本的东西吗?

l m*_*zhi 9

我已经解决了这个问题。

就我而言,我的 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`)
Run Code Online (Sandbox Code Playgroud)

密钥是 a 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
Run Code Online (Sandbox Code Playgroud)

因此,我在 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
Run Code Online (Sandbox Code Playgroud)

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

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuFSEXjLMwyAJ54d5hQQjyIE+4l5pZw7GuYFDgNCzXjl6CNwV
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

将其复制到我的本地 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.
Run Code Online (Sandbox Code Playgroud)

现在,它可以正常工作,没有 Exception ValueError: No password or public key available!

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() 
Run Code Online (Sandbox Code Playgroud)

它输出30023.


小智 7

也许你应该添加私钥

ssh-add ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)


ipe*_*ffo 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