Python通过SSH连接PostgreSQL服务器失败求助
兄弟,我刚踩过几乎一模一样的坑,太懂这种连接被拒的崩溃感了!咱们先理清楚你的场景,再一步步解决:
先明确你的代码运行场景
你提到手动通过SSH登录服务器后,切换到postgres用户能正常访问PG,但Python代码连接时报错。这里分两种常见情况:
情况1:你的Python代码在本地电脑运行,想连接远程服务器上的PG
这种情况的核心问题是:PG默认只监听服务器的本地端口,不会直接暴露到公网。你需要先建立SSH隧道,把本地端口转发到服务器的5432端口:
先在本地终端运行SSH隧道命令:
ssh -L 5432:localhost:5432 SSH_USER@你的服务器IP地址这个命令会把你本地的5432端口,映射到远程服务器的localhost:5432端口。
然后在Python代码里,连接本地的5432端口就相当于连接远程服务器的PG了(以psycopg2为例):
import psycopg2 try: conn = psycopg2.connect( dbname="你的数据库名", user="postgres", password="postgres用户的密码", # 注意:手动切用户后psql可能免密,但TCP连接可能需要密码 host="localhost", port=5432 ) print("连接成功!") except Exception as e: print(f"连接失败:{e}")
情况2:你的Python代码在远程服务器上运行,但连接localhost失败
这种情况是因为你手动用psql连接时,默认用的是Unix套接字(不需要TCP端口),但Python代码默认尝试TCP连接,而PG可能没开启TCP监听:
步骤1:检查PG是否开启TCP监听
切换到postgres用户后,运行命令查看端口监听状态:
ss -tulpn | grep 5432
如果看不到localhost:5432或者0.0.0.0:5432的输出,说明PG没开启TCP监听,需要修改配置。
步骤2:修改PG配置文件
找到
postgresql.conf文件(通常路径是/etc/postgresql/你的PG版本/main/或者/var/lib/postgresql/你的PG版本/main/),修改listen_addresses参数:listen_addresses = 'localhost' # 只允许本地TCP连接,安全起见推荐这个 # 如果需要允许外部连接可以改成'*',但一定要配合pg_hba.conf限制访问找到
pg_hba.conf文件,添加一行允许本地TCP连接的规则:host all all 127.0.0.1/32 scram-sha-256(如果是旧版本PG,可能用
md5代替scram-sha-256)重启PG服务生效:
sudo systemctl restart postgresql
步骤3:或者直接用Unix套接字连接(无需修改配置)
如果你不想改PG配置,也可以让Python直接用Unix套接字连接(和你手动psql的方式一致),只需要指定套接字路径:
import psycopg2 conn = psycopg2.connect( dbname="你的数据库名", user="postgres", host="/var/run/postgresql/" # 这个路径是PG默认的套接字目录,不同系统可能略有差异 )
额外排查小技巧
- 先手动测试TCP连接:在服务器上运行
psql -h localhost -p 5432 -U postgres,如果这个命令也报错,那问题和Python无关,先解决PG的TCP监听配置。 - 确认
pg_settings里的port确实是5432,避免端口配置不一致。
内容的提问来源于stack exchange,提问作者st2 tas




