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的预期参数有误解吗?关于密钥和密码更基本的东西吗?
我已经解决了这个问题。
就我而言,我的 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.
如果您还没有找到解决方案,就我而言,问题出在私钥的路径上。而不是使用:
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
| 归档时间: |
|
| 查看次数: |
6566 次 |
| 最近记录: |