Python3通过SSH连接PostgreSQL失败求助
解决Python通过SSH隧道连接PostgreSQL的连接拒绝问题
看起来你遇到的核心问题是SSH隧道没有正确将本地端口映射到远程PostgreSQL端口——虽然手动SSH连接正常,但脚本里的端口映射逻辑有疏漏。我帮你一步步排查和修复:
问题分析
你收到的关键错误提示:
could not connect to server: Connection refused Is the server running on host
127.0.0.1and accepting TCP/IP connections on port5432?
这说明你的Python代码尝试连接本地5432端口,但这个端口并没有被SSH隧道正确转发到远程的PostgreSQL服务上。因为SSHTunnelForwarder默认会随机分配一个本地端口,而不是固定绑定5432(除非你显式指定)。
修复步骤
1. 显式指定本地绑定端口
修改代码,明确指定local_bind_address,将本地的某个端口(比如5433)映射到远程的5432端口。这样psycopg2就能准确连接到隧道的本地端口:
from sshtunnel import SSHTunnelForwarder import psycopg2 # 显式指定本地绑定端口,避免随机分配 with SSHTunnelForwarder( "hostname", ssh_username="username", ssh_password="password", remote_bind_address=("127.0.0.1", 5432), local_bind_address=("127.0.0.1", 5433) # 添加这行,指定本地映射端口 ) as server: try: # 连接时使用本地绑定的端口5433 conn = psycopg2.connect( host="127.0.0.1", port=5433, # 对应上面的local_bind_address端口 dbname="db_name", user="db_user", password="db_password" ) cursor = conn.cursor() cursor.execute("SELECT * from table") rows = cursor.fetchall() print(rows) # 用完记得关闭连接 cursor.close() conn.close() except Exception as e: print("Uh oh, can't connect. Invalid dbname, user or password?") print(e)
2. 验证隧道是否正常建立
可以在代码里添加一行打印,确认隧道的本地端口是否正确生效:
with SSHTunnelForwarder(...) as server: print(f"SSH隧道已建立,本地映射端口:{server.local_bind_port}") # 后续连接代码...
如果没有指定local_bind_address,这里会输出一个随机端口,此时你需要把psycopg2的port参数改成这个随机值。
3. 处理psycopg2的警告信息
你收到的psycopg2警告提示从2.8版本开始,二进制包改名为psycopg2-binary,可以执行以下命令替换安装:
pip uninstall psycopg2 pip install psycopg2-binary
4. 额外检查(可选)
虽然你手动SSH连接正常,但可以确认远程服务器上的PostgreSQL配置:
- 检查
postgresql.conf里的listen_addresses是否包含127.0.0.1(默认是开启的) - 检查
pg_hba.conf是否允许本地用户(db_user)从127.0.0.1连接数据库
内容的提问来源于stack exchange,提问作者user3054328
相关产品推荐
相关产品推荐

