无法通过 python 通过 SSH 连接到 postgres 服务器

Posted

技术标签:

【中文标题】无法通过 python 通过 SSH 连接到 postgres 服务器【英文标题】:Can't connect to postgres server over SSH through python 【发布时间】:2018-08-14 22:26:24 【问题描述】:

我正在尝试通过 SSH 连接到服务器并连接到在其上运行的 postgres 实例。我可以通过 SSH 连接到服务器并通过 termianl 访问 postgres 服务器,并且 pg_settings 中的端口是 5432。如果有任何区别,在使用 SSH_USER SSH 进入服务器后,我必须切换用户('sudo su - postgres')。

错误:

psycopg2.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

代码:

SSH_HOST = 'xxx.xxx.xxx.xxx'
SSH_FOREIGN_PORT = 22
SSH_USER = 'user1'
SSH_PASS = 'pass'
PORT = 5432
DBNAME = 'testdb'
USER = 'postgres'
PASS = ''

def main_psql():
    #try:
    with SSHTunnelForwarder((SSH_HOST, SSH_FOREIGN_PORT), ssh_username=SSH_USER, ssh_password=SSH_PASS, remote_bind_address=('localhost', PORT)) as server:
        server.start()
        cnx = psycopg2.connect(dbname=DB_NAME, user=USER, password=PASS)

编辑:错误 2:

File "/Users/me/PycharmProjects/proj/src/import_psql.py", line 285, in main_psql
  cnx = psycopg2.connect(dbname=DB_NAME, user=USER, password=PASS, host='localhost', port=PORT) #, host='/var/run/postgresql')
File "/Users/me/PycharmProjects/proj/venv/lib/python2.7/site-packages/psycopg2/__init__.py", line 130, in connect
  conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

无法连接到服务器:连接被拒绝 服务器是否在主机“localhost”(::1) 上运行并接受 端口 5432 上的 TCP/IP 连接?`

如果我通过终端在 SSH'g 之后从 postgres 用户运行 netstat,我会得到:

-bash-4.2$ netstat -nl |grep 5432
tcp        0      0 0.0.0.0:5432            0.0.0.0:*               LISTEN     
tcp6       0      0 :::5432                 :::*                    LISTEN     
unix  2      [ ACC ]     STREAM     LISTENING     26541    /var/run/postgresql/.s.PGSQL.5432
unix  2      [ ACC ]     STREAM     LISTENING     26543    /tmp/.s.PGSQL.5432

【问题讨论】:

【参考方案1】:

您必须在psycopg2.connect(dbname=DB_NAME, user=USER, password=PASS, host=..., port=...) 中指定 HOST 和 PORT。 默认情况下,postgres 客户端连接到 Unix 域套接字而不是 TCP 套接字。

【讨论】:

如果我将主机指定为 localhost 并将端口指定为 5432(我认为这是正确的),我会收到以下错误(添加到主帖)。 然后在 bash 中测试你的 ssh 隧道。 SSHTunnelForwarder 库可能有问题。创建一个隧道并从终端使用标准 psql 连接到它。

以上是关于无法通过 python 通过 SSH 连接到 postgres 服务器的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 ssh 连接到 Github,无法访问 .ssh.config

通过 SSH 连接到 EBS 创建的 EC2 实例

无法通过 SSH 连接到 Gitlab

无法通过 SSH 连接到家用计算机 [关闭]

无法通过 SSH 连接到曾经正常工作的 GCP 虚拟机实例

无法通过运行 OpenSSH 的 SSH 连接到 Windows 10