2013-06-25 5 views
4

Учитывая IP-адрес и номер порта, можно ли проверить, имеет ли аппарат с этим IP-адресом прослушивание Postgresql на указанном порту? Если да, то как?Проверьте, не прослушивается ли Postgresql

Я просто хочу получить логическое значение того, прослушивает ли Postgresql указанный порт указанной машины.

+3

попробуйте подключиться к клиентской библиотеке pg и попытаться войти в систему. если ничего не слушает, или это не PG, вы получите различные ошибки. если это pg и работает, вы, по крайней мере, получите разрешение на отказ/неизвестные пользовательские/любые ошибки. –

+0

@Marc Спасибо за отзыв Марк. Я пытаюсь автоматизировать эту задачу как часть установки Windows. Я рассматриваю возможность написания кода C# для этого. Знаете ли вы о хорошей библиотеке C#, с которой я мог бы попытаться подключиться к postgresql? Кроме того, если вы могли бы подсказать, какие ошибки указывают, что postgresql прослушивает и какие ошибки указывают на другое, это также было бы полезной информацией. – ksun

+0

Я изучаю использование Npgsql – ksun

ответ

5

Я думаю, вам нужно определить, что вы пытаетесь добиться большего. Хочешь узнать только, если ничего слушает? Если PostgreSQL прослушивает данный порт? Если PostgreSQL работает и фактически принимает соединения? Если вы можете подключиться к PostgreSQL, успешно пройти аутентификацию и выдавать запросы?

Один из вариантов - вызвать psql для подключения к нему и проверить код результата. Не пытайтесь анализировать выходной текст, поскольку это зависит от перевода на разные языки.

лучше использовать клиентскую библиотеку для языка по вашему выбору - psycopg2 для Python, PgJDBC для Java, камень Pg для Ruby, DBD::Pg для Perl, nPgSQL для C# и т.д. Это подход, который я бы рекомендовал. Сведения о SQLSTATE или исключении из любой ошибки соединения расскажут вам больше о том, почему соединение не удалось - вы сможете указать разницу между сервером, который не прослушивает, отказ аутентификации и т. Д. Таким образом. Например, в Python:

import psycopg2 
try: 
    conn = psycopg2.connect("host=localhost dbname=postgres") 
    conn.close(); 
except psycopg2.OperationalError, ex: 
    print("Connection failed: {0}".format(ex)); 

Есть детали исключения в ex.pgcode (SQLSTATE), чтобы сказать вам об ошибках that're генерируется на стороне сервера, как неудачи аутентификации; он будет пустым для ошибок на стороне клиента.

Если вы просто хотите увидеть, если что-то прослушивает данный порт 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, ex: 
    print("Connection failed with errno {0}: {1}".format(ex.errno, ex.strerror))    

Такой же подход применяется в любом языке программирования, только детали библиотеки сокетов и обработки ошибок изменяются.

Для некоторых целей также полезно использовать инструмент netstat, чтобы пассивно перечислить, какие процессы прослушивают сетевые сокеты. Встроенный netstat на Windows довольно мертв мозг, поэтому вам нужно сделать больше синтаксического анализа вывода, чем с netstat для других платформ, но он все равно будет выполнять эту работу. Наличие сокета в netstat не означает, что соединение с ним будет успешным; если процесс потерпел неудачу каким-то образом, что оставит его сломанным, но все еще работает (застрял в бесконечном цикле, заблокированном отладчиком, SIGSTOP ed и т. д.), то он не будет реагировать на фактическую попытку подключения.

+0

Ничего себе, спасибо за предоставление такого углубленного ответа, Крейг. Приношу свои извинения за то, что вы не включили все детали в мой первоначальный вопрос. Мне интересно узнать, что postgreSQL специально прослушивает порт, и если он принимает соединения. - И это для ОС Windows. Я решил использовать библиотеку npsql C# для этого. – ksun

6

Вы можете использовать, например, 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) 

В качестве альтернативы вы можете просто "SELECT 1" с PSQL, и проверьте вывод:

=$ 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? 
+0

Спасибо депез. Я предполагаю, что могу разобрать вывод nmap и проверить, будет ли STATE = open и SERVICE = postgresql. Основная проблема, которую я испытываю с этим подходом, состоит в том, что, поскольку я планирую выполнить эту задачу как часть установки, nmap необходимо будет установить на машине клиента. Я не уверен, что мы хотим этого требовать. Возможно, ваше альтернативное решение будет работать. – ksun

+1

Я думаю, что 'netstat' является частью Windows. Он также может определить, прослушивает ли PostgreSQL. –

+0

На самом деле, просто прошел тест с прослушиванием постгрейтов на другом компьютере, и когда я запустил nmap, я обнаружил, что STATE = filter. Но я думаю, что использование psql-команды с «Select 1» и проверка на ошибку соединения может быть лучшим решением, с которым я столкнулся до сих пор. – ksun