【问题标题】:Paramiko or sshtunnel and ssh-agent without entering passphraseParamiko 或 sshtunnel 和 ssh-agent 无需输入密码
【发布时间】:2019-06-10 08:22:26
【问题描述】:

我正在尝试使用 sshtunnel 创建到服务器的隧道。我正在使用 ssh-key 和 ssh-agent:

from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
    (proxyhost, 22),
    ssh_username=ssh_username,
    #ssh_private_key_password=PASSPHRASE, # with this line it works
    remote_bind_address=('127.0.0.1', 3306),
) as tunnel:
    pass

找到了正确的私钥,当我给出密码作为参数时,隧道就建立了(见上面的注释行)。

但是我已经用 ssh-agent 解锁了我的 ssh 私钥(我只是在重启后第一次使用 ssh 时才被要求输入我的 ssh 密码)。是否可以让 paramiko/sshtunnel 在不提示输入密码的情况下获得解锁的私钥?我想避免将我的密码短语存储在磁盘上的任何位置。

【问题讨论】:

  • 显然是可能的。 demo.py 有效,我现在要做的就是将它与 forward.py 结合起来。代码将随之而来。
  • 我无法让它在合理的时间内工作。显然, sshtunnel 曾经支持过这一点,但现在它不起作用。也许是回归。

标签: python paramiko ssh-tunnel ssh-agent


【解决方案1】:

我遇到了这个问题,最后想出了一个解决方案。我试图使用 alembic 来运行迁移并且需要通过 ssh 隧道。如果 SSHTunnel 正在运行,它应该可以访问您的代理,但它也会产生如下错误:

    ERROR [sshtunnel.SSHTunnelForwarder:1233][MainThread] Password is required for key  

通过导入 paramiko,然后使用 paramiko.agent.Agent().get_keys(),我能够访问存储在 macOS 钥匙串中的加密密钥。

这是您的更新代码:

from sshtunnel import SSHTunnelForwarder
import paramiko

with SSHTunnelForwarder(
    (proxyhost, 22),
    ssh_username=ssh_username,
    ssh_pkey=paramiko.agent.Agent().get_keys(),
    remote_bind_address=('127.0.0.1', 3306),
) as tunnel:
    pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2020-08-26
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多