如果我指定主机 localhost,psql 会中断

ift*_*itz 5 postgresql tcpip postgresql-9.3

我知道有人过这个或类似的问题 其他地方。其他答案都没有对我有用。

机器是 Macbook Pro 2014 / OS X Yosemite 10.10,通过 Homebrew 安装了 Postgres 9.3.5。

如果我没有指定主机,我只能连接到我的本地 postgres 实例。这有效:

psql -Umyuser -d mydb
sql (9.4.4)
Type "help" for help.

myuser=# 
Run Code Online (Sandbox Code Playgroud)

-h localhost 才不是:

psql -Umyuser -d mydb -h localhost
psql: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
Run Code Online (Sandbox Code Playgroud)

在我收到这条消息之前,它暂停了很长时间。

我正在尝试设置一个似乎想要指定 localhost 的第三方工具,因此不能仅将其关闭。

如果我理解我在其他地方正确阅读的内容,那么如果您使用 TCP/IP 并指定-h localhost强制使用,则 postgres 的行为会有所不同。因此,我在 中添加了以下内容pg_hba.conf

local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             localhost               trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
Run Code Online (Sandbox Code Playgroud)

(127.0.0.1 AND localhost 似乎是多余的,但绝望会驱使迷信)......在postgresql.conf

listen_addresses = 'localhost'          
port = 5432                             
Run Code Online (Sandbox Code Playgroud)

netstat 确认 Postgres 正在侦听该端口:

?  ~  netstat -an | grep 5432
tcp4       0      0  127.0.0.1.5432         *.*                    LISTEN     
tcp6       0      0  ::1.5432               *.*                    LISTEN     
d8d7c0e31d5add1d stream 0 0 d8d7c0e326b18a1d 0 0 0 /tmp/.s.PGSQL.5432
Run Code Online (Sandbox Code Playgroud)

所有权限都在套接字文件上设置:

~ ls -l /tmp/.s.PGSQL.5432
srwxrwxrwx  1 fritz  wheel  0 12 Jul 13:27 /tmp/.s.PGSQL.5432
Run Code Online (Sandbox Code Playgroud)

/etc/hosts 有一个本地主机条目:

127.0.0.1   localhost
::1         localhost
Run Code Online (Sandbox Code Playgroud)

psqlpg_ctl指向相同的安装:

~ which psql               
/usr/local/bin/psql
~ ll /usr/local/bin/psql
/usr/local/bin/psql -> ../Cellar/postgresql/9.4.4/bin/psql
~ which pg_ctl
/usr/local/bin/pg_ctl
~  ll /usr/local/bin/pg_ctl
/usr/local/bin/pg_ctl -> ../Cellar/postgresql/9.4.4/bin/pg_ctl
Run Code Online (Sandbox Code Playgroud)

psql我的系统上的其他地方没有任何名称似乎可以劫持这个过程:

~  sudo find / -name psql
/Applications/pgAdmin3.app/Contents/SharedSupport/psql
/Users/fritz/devtools/phantomjs/src/qt/config.tests/unix/psql
/Users/fritz/Qt/5.3/Src/qtbase/config.tests/unix/psql
/Users/fritz/Qt/5.3/Src/qtbase/src/plugins/sqldrivers/psql
/Users/fritz/Qt/5.3/Src/qtbase/src/sql/drivers/psql
/usr/local/bin/psql
/usr/local/Cellar/postgresql/9.4.4/bin/psql
Run Code Online (Sandbox Code Playgroud)

更新:telnet 连接到 localhost 5432 一段时间,然后断开连接:

~  telnet localhost 5432
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)

更新2:我使用wireshark 来监视tcp localhost 端口5432。问题是,我不知道我应该看到什么以及结果是否/如何错误。希望有人可以制作此捕获文件

ift*_*itz 1

感谢pgsql-general 上的建议,我用 netcat 检查 TCP/IP,我发现发送到 localhost 的前几个字节被一个旨在保留 Internet 访问审计跟踪的进程吞没了。已卸载,一切正常。