我正在使用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 - 没有?)< / p>
无论ssh_pkey
是指向公钥还是私钥,都会发生这种情况。
这里可能会发生什么?我是否误解了SSHTunnelForwarder的预期论点?密钥和密码更基本的东西?
答案 0 :(得分:2)
也许您应该添加私钥
ssh-add ~/.ssh/id_rsa
答案 1 :(得分: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
答案 2 :(得分:1)
我已经解决了这个问题。
在我的情况下,我的macOS ~/.ssh/id_rsa
以-----BEGIN OPENSSH PRIVATE KEY-----
开头,这不是正确的开始行。
实际上,ssh_pkey
应该以{{1}}开头。根据{{1}}模型的源代码:
-----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`)
应该正确转换为paramiko.pkey。
paramiko.pkey.PKey
因此,我在Linux操作系统上使用~/.ssh/id_rsa
命令生成了一个新密钥,然后
我授权使用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
访问密钥。
ssh-keygen -t rsa
现在我的Linux操作系统上的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
将其复制到我的本地Mac,然后进行测试。
~/.ssh/id_rsa
现在,它可以正常运行而没有异常-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAuFSEXjLMwyAJ54d5hQQjyIE+4l5pZw7GuYFDgNCzXjl6CNwV
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX
-----END RSA PRIVATE KEY-----
。
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!
。
答案 3 :(得分:0)
通过在计算机上运行以下命令,我遇到了类似的问题。我能够解决此问题。
$ssh-add ~/.ssh/id_rsa
答案 4 :(得分:-2)
昨天我遇到了同样的问题。我以前使用的代码效果很好。但是三个月后,它将无法使用“没有可用的密码或公钥”例外。我发现我的paramiko版本是2.5,所以我将其更新为2.7。然后代码可以再次正常工作。