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 で "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?
何をより良く達成しようとしているのかを定義する必要があると思います。何かが特定のポイントでリッスンしているかどうかを知りたいだけですか? PostgreSQLが特定のポートでリッスンしている場合は? PostgreSQL が実行されていて、実際に接続を受け入れている場合は? PostgreSQL に接続できれば、認証に成功し、クエリを発行できますか?
1 つのオプションは、呼び出しpsql
て接続し、結果コードを確認することです。出力テキストは別の言語に翻訳される可能性があるため、解析しないでください。
psycopg2
Python の場合は、Java の場合は PgJDBC、Ruby の場合は Pg gem、 Perl の場合は、C# の場合は nPgSQL など、選択した言語のクライアント ライブラリを使用することをDBD::Pg
お勧めします。これが私が推奨するアプローチです。接続エラーからの 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 のみ)、またはソケットを作成して 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
ても、接続が成功するわけではありません。プロセスがなんらかの方法で失敗して壊れたままになっている場合 (無限ループに陥っている、デバッガーによってブロックされている、SIGSTOP
ed など)、実際の接続試行には応答しません。