检查Postgresql是否在监听

ksu*_*sun 5 database postgresql port boolean ip-address

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

我只想获得一个布尔值,即Postgresql是否正在侦听指定机器的指定端口.

小智 10

例如,您可以使用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)
Run Code Online (Sandbox Code Playgroud)

或者你可以用psql"SELECT 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?
Run Code Online (Sandbox Code Playgroud)


Nam*_* VU 7

简单来说

详细信息

最快的方法是使用具有超时功能的netcataka (此处共享)nc

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

echo 'QUIT' | nc -w SECONDS YOUR_HOST PORT; echo $?
# eg
echo 'QUIT' | nc -w 1       localhost 5432; echo $?
Run Code Online (Sandbox Code Playgroud)

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

echo -e '\x1dclose\x0d' | telnet YOUR_HOST PORT
# eg
echo -e '\x1dclose\x0d' | telnet localhost 5432
Run Code Online (Sandbox Code Playgroud)


Cra*_*ger 6

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

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

更好的是,将客户端库用于您选择的语言 - psycopg2用于Python,PgJDBC用于Java,用于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))
Run Code Online (Sandbox Code Playgroud)

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

如果您只是想查看某些内容是否正在侦听给定的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))            
Run Code Online (Sandbox Code Playgroud)

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

出于某些目的,使用该netstat工具被动地列出哪些进程正在侦听哪些网络套接字也是有用的.netstatWindows上的内置功能非常糟糕,因此您需要对输出进行比netstat其他平台更多的解析,但它仍然可以完成这项工作.但是,套接字的存在netstat并不意味着连接它会成功; 如果进程以某种方式失败而导致其崩溃但仍在运行(陷入无限循环,被调试器,SIGSTOPed等阻止),那么它将不会响应实际的连接尝试.