- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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/
我是一名优秀的程序员,十分优秀!