Python通过SSH隧道连接MS SQL Server时连接失败问题求助
SSH隧道连接公司内网MS SQL Server连接失败解决方案
核心问题定位
当前连接失败发生在SSH跳板机登录阶段,尚未进入隧道转发、SQL连接的流程,你看到的Could not receive SSH config file、0 Keys loaded from agent、0 keys loaded属于正常日志提示:SSHTunnelForwarder默认会优先读取本地SSH配置文件、ssh-agent存储的密钥进行登录,未找到密钥时自动切换到密码登录,上述日志并非报错根源。
排查修复步骤
1. 手动验证SSH跳板机连通性
先跳过代码,直接用终端/第三方SSH工具(如Xshell、FinalShell)执行SSH登录命令,验证基础信息是否正确:ssh <SSH用户名>@<跳板机公网IP> -p <SSH端口>
输入密码后如果无法登录,优先排查以下问题:
- 跳板机IP、SSH端口(默认22,多数企业会修改为自定义端口)、用户名、密码是否填写正确
- 当前使用的网络是否有权限访问跳板机,部分企业需要接入办公内网、开启网络准入权限后才可访问跳板机
- 你的账号是否拥有SSH登录跳板机的权限、账号是否处于有效期
2. 修正SSHTunnelForwarder参数配置
绝大多数报错是由于第一个参数填写错误导致,注意第一个参数为跳板机的公网IP/域名,不是localhost,正确配置参考:
from sshtunnel import SSHTunnelForwarder # 初始化SSH隧道 ssh_tunnel = SSHTunnelForwarder( # 跳板机连接信息,替换为实际值 ("跳板机公网IP", 跳板机SSH端口), ssh_username="你的跳板机用户名", ssh_password="你的跳板机登录密码", # 远端要访问的SQL Server内网地址,默认端口1433 remote_bind_address=("SQL Server内网IP", 1433), # 可选,指定本地绑定的端口,不填则默认随机分配 local_bind_address=("127.0.0.1", 14330) ) # 启动隧道 ssh_tunnel.start() # 打印本地绑定端口,未指定local_bind_address时用这个值连接SQL print(ssh_tunnel.local_bind_port)
3. 连接MS SQL Server
隧道启动成功后,SQL连接配置填写如下:
- 服务器地址:
127.0.0.1 - 端口:你配置的本地端口(如上面的14330,或打印出的
ssh_tunnel.local_bind_port值) - 用户名、密码:MS SQL Server本身的账号密码,和跳板机账号无关
其他常见问题排查
- 若手动SSH可登录,代码仍报错,检查密码中的特殊字符是否在Python字符串中正确转义,可使用raw字符串(
r"密码")避免转义问题 - 若企业跳板机需要MFA二次认证,密码登录方式不支持,需要配置SSH密钥登录:将你本地的SSH公钥添加到跳板机的
~/.ssh/authorized_keys文件中即可 - 确认跳板机本身有权限访问内网SQL Server,可登录跳板机后执行
telnet SQL内网IP 1433验证连通性
内容的提问来源于stack exchange,提问作者Governor
相关产品推荐
相关产品推荐

