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 で "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?
于 2013-06-25T17:30:35.290 に答える
11

何をより良く達成しようとしているのかを定義する必要があると思います。何かが特定のポイントでリッスンしているかどうかを知りたいだけですか? PostgreSQLが特定のポートでリッスンしている場合は? PostgreSQL が実行されていて、実際に接続を受け入れている場合は? PostgreSQL に接続できれば、認証に成功し、クエリを発行できますか?

1 つのオプションは、呼び出しpsqlて接続し、結果コードを確認することです。出力テキストは別の言語に翻訳される可能性があるため、解析しないでください。

psycopg2Python の場合は、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ても、接続が成功するわけではありません。プロセスがなんらかの方法で失敗して壊れたままになっている場合 (無限ループに陥っている、デバッガーによってブロックされている、SIGSTOPed など)、実際の接続試行には応答しません。

于 2013-06-25T23:56:58.403 に答える