You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用密码而非密钥文件配置Python sshtunnel建立SSH隧道?

问题原因

这不是依赖版本的bug,是sshtunnel底层基于paramiko的默认认证逻辑导致的:默认会优先尝试SSH Agent中存储的密钥、本地~/.ssh路径下的所有私钥进行认证,所有密钥类认证方式都失败后才会尝试你传入的密码认证。你本地的id_rsa密钥有密码保护,且本身存在签名异常,所以还没走到密码认证步骤就提前报错终止了。

解决方案

在初始化SSHTunnelForwarder时显式添加3个参数,关闭所有密钥类认证的逻辑,强制使用密码认证:

  • allow_agent=False:禁止读取本地SSH Agent中存储的密钥
  • ssh_pkey=None:显式指定不使用任何私钥文件
  • host_pkey_directories=[]:禁止扫描本地默认路径下的私钥文件

另外你当前代码中手动调用tunnel.start()是多余的,使用with上下文管理器时,进入代码块会自动执行隧道初始化和启动逻辑,重复调用可能引发异常。

修改后的代码如下:

with sshtunnel.SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
        ssh_password=ssh_password,
        remote_bind_address=(db_ip, db_port),
        # 新增以下三个配置项
        allow_agent=False,
        ssh_pkey=None,
        host_pkey_directories=[]
) as tunnel:
    # 删掉手动tunnel.start()调用
    logger.debug(f"IsUp: {tunnel.tunnel_is_up} | {tunnel.local_bind_address}")
    # 后续连接数据库的逻辑写在这里

如果上述配置后仍然有异常,可以额外添加参数ssh_config_file=None,禁止读取本地ssh配置文件的默认认证规则。

内容的提问来源于stack exchange,提问作者asturm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:45:05