我使用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的预期论点有些误解?关于密钥和密码的一些更基本的东西?
如果你还没有找到解决方案,在我的情况下,问题是私钥的路径。 而不是使用:
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也许您应该添加私钥
我已经解决了这个问题。
在我的例子中,我的macOS
~/.ssh/id_rsa
从-----BEGIN OPENSSH PRIVATE KEY-----
开始,这不是正确的开始行。实际上,
ssh_pkey
应该从-----BEGIN RSA PRIVATE KEY-----
开始。根据sshtunnel
模型的源代码:密钥是
paramiko.pkey.PKey
,这意味着~/.ssh/id_rsa
应该正确地转换为paramiko.pkey。因此,我在linux操作系统中生成一个新的密钥,命令是
ssh-keygen -t rsa
,然后 我使用ssh-copy-id -i ~/.ssh/id_rsa.pub username@jump_server_host -p ssh_port
授权访问密钥。现在linux操作系统上的
~/.ssh/id_rsa
看起来像:把它复制到我的本地mac,然后测试它。
现在,它毫无例外地工作。
它输出
30023
。相关问题 更多 >
编程相关推荐