给定一个 IP 地址和端口号,是否可以检查具有该 IP 地址的机器是否在指定端口上侦听 Postgresql?如果是这样,怎么做?
我只想获取 Postgresql 是否正在侦听指定机器的指定端口的布尔值。
给定一个 IP 地址和端口号,是否可以检查具有该 IP 地址的机器是否在指定端口上侦听 Postgresql?如果是这样,怎么做?
我只想获取 Postgresql 是否正在侦听指定机器的指定端口的布尔值。
例如,您可以使用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?
我认为你需要定义你想要更好地实现的目标。您是否只想知道某个点上是否有任何东西在听?如果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
并不意味着连接到它会成功;如果进程以某种方式失败,导致其损坏但仍在运行(陷入无限循环,被调试器、SIGSTOP
ed 等阻塞),那么它将不会响应实际的连接尝试。
简单来说
详细介绍
最快的方法是使用具有超时功能的netcat
aka ,如此处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