求助: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
相关产品推荐
相关产品推荐

