【问题标题】:Check if Postgresql is listening检查 Postgresql 是否正在监听
【发布时间】:2013-06-22 14:46:56
【问题描述】:

给定一个 IP 地址和端口号,是否可以检查具有该 IP 地址的机器是否在指定端口上侦听 Postgresql?如果有,怎么做?

我只想获取一个布尔值,表明Postgresql是否正在监听指定机器的指定端口。

【问题讨论】:

  • 尝试连接 pg 客户端库并尝试登录。如果没有东西在听,或者不是 PG,你会得到各种错误。如果它是 pg 并且正在运行,你至少会得到权限被拒绝/未知用户/任何错误。
  • @Marc 感谢马克的提示。我正在尝试将此任务作为 Windows 安装的一部分自动执行。我正在考虑编写一些 C# 代码来实现这一点。你知道我可以尝试连接到 postgresql 的一个好的 C# 库吗?此外,如果您可以帮助枚举哪些错误表明 postgresql 正在侦听,哪些错误表明其他情况,这也是有用的信息。
  • 我正在研究使用 Npgsql
  • 以后请在原始问题中提供更多背景信息;您要问的“如何”的“为什么”。了解平台和语言等细节非常有用。也总是在问题中包含您的 PostgreSQL 版本。
  • 取自github.com/influxdata/influxdb/issues/4595curl -v -sL -I localhost:5432/ping怎么样

标签: database postgresql boolean port ip-address


【解决方案1】:

您可以使用例如nmap 工具:

=$ sudo nmap -v -p 5930 127.0.0.1

Starting Nmap 6.00 ( http://nmap.org ) at 2013-06-25 19:28 CEST
Initiating SYN Stealth Scan at 19:28
Scanning localhost (127.0.0.1) [1 port]
Discovered open port 5930/tcp on 127.0.0.1
Completed SYN Stealth Scan at 19:28, 0.03s elapsed (1 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000045s latency).
PORT     STATE SERVICE
5930/tcp open  unknown

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds
           Raw packets sent: 1 (44B) | Rcvd: 2 (88B)

或者,您可以使用 psql 只“选择 1”,然后检查输出:

=$ psql -h 127.0.0.1 -p 5930 -c "select 1"
 ?column? 
----------
        1
(1 row)

=$ psql -h 127.0.0.1 -p 5940 -c "select 1"
psql: could not connect to server: Connection refused
        Is the server running on host "127.0.0.1" and accepting
        TCP/IP connections on port 5940?

【讨论】:

  • 谢谢你。我想我可以解析 nmap 输出并检查 STATE = open 和 SERVICE = postgresql。我对这种方法的主要担忧是,因为我计划在安装过程中执行此任务,所以需要在客户端计算机上安装 nmap。我不确定我们是否需要这样做。不过,也许您的替代解决方案会奏效。
  • 我认为 netstat 是 Windows 的一部分。也可以判断PostgreSQL是否在监听。
  • 实际上,刚刚用 postgres 在另一台机器上进行了测试,当我运行 nmap 时,我发现 STATE=filtered。但我认为使用带有“Select 1”的 psql 命令并检查连接错误可能是迄今为止我遇到的最佳解决方案。
  • @"Mike Sherrill 'Catcall'" 迈克,谢谢,我也会调查一下 netstat。
  • @Mike,在简要了解 netstat 之后,它似乎是 Windows 的一部分,并且是列出所有正在侦听或已建立计算机连接的端口的好工具,我m 试图查看 postgres 是否正在侦听另一台主机上的指定端口。有没有办法用 netstat 做到这一点?
【解决方案2】:

我认为您需要定义您想要更好地实现的目标。您是否只想知道 anything 是否正在监听某个点?如果 PostgreSQL 正在监听给定的端口?如果 PostgreSQL 正在运行并实际接受连接?如果可以连接到 PostgreSQL,验证成功并发出查询?

一种选择是调用psql 来连接它并检查结果代码。不要尝试解析输出文本,因为它会被翻译成不同的语言。

更好的是,为您选择的语言使用客户端库 - psycopg2 用于 Python,PgJDBC 用于 Java,Pg gem 用于 Ruby,DBD::Pg 用于 Perl,nPgSQL 用于 C# 等。这就是我的方法d 推荐。来自任何连接错误的 SQLSTATE 或异常详细信息将告诉您有关连接失败原因的更多信息——您将能够通过这种方式分辨服务器未侦听、身份验证失败等之间的区别。例如,在 Python 中:

import psycopg2
try:
    conn = psycopg2.connect("host=localhost dbname=postgres")
    conn.close()
except psycopg2.OperationalError as ex:
    print("Connection failed: {0}".format(ex))

ex.pgcodeSQLSTATE)中有异常详细信息,可以告诉您有关服务器端生成的错误的更多信息,例如身份验证失败;对于客户端错误,它将为空。

如果您只想查看 某事 是否正在侦听给定的 IP 和 TCP 端口,您可以使用netcat(仅限*nix)或您选择的语言的简单脚本它创建一个套接字并执行 connect() 然后如果它获得成功的响应则关闭套接字。例如,以下简单的 Python 脚本:

import socket                                                                                                                                                              
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.connect(('localhost',5432))
    s.close()
except socket.error as ex:
    print("Connection failed with errno {0}: {1}".format(ex.errno, ex.strerror))            

同样的方法适用于任何编程语言,只是套接字库的细节和错误处理有所不同。

出于某些目的,使用netstat 工具被动列出哪些进程正在侦听哪些网络套接字也很有用。 Windows 上的内置 netstat 相当脑残,因此与其他平台的 netstat 相比,您必须对输出进行更多的解析,但它仍然可以完成这项工作。不过,netstat 中存在套接字并不意味着连接到它会成功;如果进程以某种方式失败,导致其损坏但仍在运行(陷入无限循环,被调试器阻止,SIGSTOPed 等),则它不会响应实际的连接尝试。

【讨论】:

  • 哇,感谢您提供如此深入的回答,克雷格。我很抱歉没有在我的原始问题中包含所有细节。我有兴趣知道 postgreSQL 是否专门监听端口,以及它是否正在接受连接。 - 这是针对 Windows 操作系统的。我决定使用 npsql C# 库来完成此任务。
  • 很棒的答案!
【解决方案3】:

简述

详情

最快的方法是使用netcat aka nc 与共享here 一样具有超时能力

结果为 0/1 表示 postgres 工作/不工作

echo 'QUIT' | nc -w SECONDS YOUR_HOST PORT; echo $?
# eg
echo 'QUIT' | nc -w 1       localhost 5432; echo $?

另一种对我有用的更快的方法是使用telnet,正如here所讨论的那样。

echo -e '\x1dclose\x0d' | telnet YOUR_HOST PORT
# eg
echo -e '\x1dclose\x0d' | telnet localhost 5432

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2012-06-09
    • 2020-05-25
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多