10

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

我只想获取 Postgresql 是否正在侦听指定机器的指定端口的布尔值。

4

3 回答 3

18

例如,您可以使用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?
于 2013-06-25T17:30:35.290 回答
11

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

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

更好的是,将客户端库用于您选择的语言——psycopg2对于 Python、对于 Java 的 PgJDBC、对于 Ruby 的 Pg gem、DBD::Pg对于 Perl、对于 C# 的 nPgSQL 等。这是我推荐的方法。来自任何连接错误的 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.pgcode( )中有异常详细信息,SQLSTATE可以告诉您更多有关服务器端生成的错误的信息,例如身份验证失败;对于客户端错误,它将为空。

如果您只是想查看是否有东西正在侦听给定的 IP 和 TCP 端口,您可以使用netcat(*nix only),或者您选择的语言中的简单脚本,它创建一个套接字并执行 connect() 然后关闭socket 如果它得到一个成功的响应。例如,以下简单的 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 等阻塞),那么它将不会响应实际的连接尝试。

于 2013-06-25T23:56:58.403 回答
4

简单来说

详细介绍

最快的方法是使用具有超时功能的netcataka ,如此nc共享

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

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

对我有用的另一种更快的方法是使用这里telnet讨论的方法。

echo -e '\x1dclose\x0d' | telnet YOUR_HOST PORT
# eg
echo -e '\x1dclose\x0d' | telnet localhost 5432
于 2020-01-09T05:18:50.713 回答