如何使用密码而非密钥文件配置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
相关产品推荐
相关产品推荐

