gpt4 book ai didi

python - sshtunnel 无法识别私钥密码

转载 作者:太空狗 更新时间:2023-10-30 00:59:35 26 4
gpt4 key购买 nike

我正在使用 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 - 不是吗?)

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

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

最佳答案

我已经解决了这个问题。

在我的例子中,我的 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`)

key 是一个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 操作系统中生成了一个新 key ,命令为 ssh-keygen -t rsa,然后我使用 ssh-copy-id -i ~/.ssh/id_rsa.pub username@jump_server_host -p ssh_port 授权访问 key 。

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.

现在,它可以正常工作,没有异常 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()

它输出 30023

关于python - sshtunnel 无法识别私钥密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com