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

求助:MAC通过Python SSH隧道连接AWS EC2 MySQL报2003错误

解决Mac Sierra下Python通过SSH隧道连接EC2 MySQL的2003错误

我完全理解你把能试的方案都试过却还是卡在这里的烦躁——咱们直接抓最可能的问题点来解决:

核心问题分析

你遇到的 (2003, "Can't connect to MySQL server on '127.0.0.1' (61)") 错误,在Mac上大概率是本地3306端口被占用,或者你的SSH隧道没有正确把本地端口和EC2上的MySQL端口做映射。

看你的Python脚本,你直接指定了连接本地3306端口,但SSHTunnelForwarder如果没有明确设置local_bind_address,默认会随机分配一个未被占用的本地端口,而不是固定用3306。如果你的Mac上已经装了MySQL服务,或者其他程序占用了3306,那隧道根本没法绑定这个端口,你的连接请求自然找不到对应的隧道服务,就会报这个错。

分步解决方案

1. 先确认本地3306端口是否被占用

打开终端执行:

lsof -i :3306

如果返回任何进程信息,说明这个端口已经被其他程序(比如你本地的MySQL)占用了,这就是问题根源。

2. 修改Python脚本,正确映射隧道端口

有两种方式解决:

方式一:指定一个未被占用的本地端口(比如3307)

修改你的脚本,给SSHTunnelForwarder加上local_bind_address参数,然后连接时用这个端口:

# -*- coding: utf-8 -*-
from sshtunnel import SSHTunnelForwarder
from MySQLdb import Connect

with SSHTunnelForwarder(
    ('Linux.AWS.EC2.IPAddress', 22),
    ssh_pkey="/Users/thomas.m/pkey.pem",
    ssh_username="ec2-user",
    remote_bind_address=('127.0.0.1', 3306),
    local_bind_address=('127.0.0.1', 3307)  # 指定本地未被占用的端口
) as server:
    conn = Connect(
        user='root',
        passwd='nhk',
        host='127.0.0.1',
        port=3307,  # 对应上面指定的本地端口
        db='mydb',
        charset="utf8")
    curs = conn.cursor()
    try:
        query = ("select distinct category from mytable;")
        curs.execute(query)
        for row in curs.fetchall():
            print(row)
    except Exception as e:
        print(f"执行出错:{str(e)}")  # 别再用pass了,打印错误才好排查
    finally:
        conn.close()  # 记得关闭数据库连接

方式二:使用隧道自动分配的随机端口

这种方式更灵活,不用手动找端口:

# -*- coding: utf-8 -*-
from sshtunnel import SSHTunnelForwarder
from MySQLdb import Connect

with SSHTunnelForwarder(
    ('Linux.AWS.EC2.IPAddress', 22),
    ssh_pkey="/Users/thomas.m/pkey.pem",
    ssh_username="ec2-user",
    remote_bind_address=('127.0.0.1', 3306)
) as server:
    # 获取隧道自动分配的本地端口
    local_port = server.local_bind_port
    print(f"当前隧道本地端口:{local_port}")
    
    conn = Connect(
        user='root',
        passwd='nhk',
        host='127.0.0.1',
        port=local_port,  # 使用这个随机端口
        db='mydb',
        charset="utf8")
    curs = conn.cursor()
    try:
        query = ("select distinct category from mytable;")
        curs.execute(query)
        for row in curs.fetchall():
            print(row)
    except Exception as e:
        print(f"执行出错:{str(e)}")
    finally:
        conn.close()

3. 额外排查点(以防万一)

  • 确认你的EC2安全组只需要允许22端口的入站流量(来自你Mac的IP)——因为SSH隧道是通过22端口转发的,3306端口不需要对外暴露,你之前的配置已经满足这点。
  • 检查你的pem密钥权限是否正确:在Mac上执行chmod 400 /Users/thomas.m/pkey.pem,确保只有你能读取这个密钥,不然SSH连接可能会出问题。

最后提示

把脚本里的except: pass改掉,打印具体错误信息——这样下次遇到问题你能直接看到到底是连接失败、查询错误还是其他问题,方便快速定位。

内容的提问来源于stack exchange,提问作者M. Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:29:07