Проверить статус одного порта на удаленном хосте

Мне нужна командная строка, которая может проверять состояние порта на удаленном хосте. Я пробовал ping xxx.xxx.xxx.xxx:161, но он не распознал "хост". Я думал, что это был "хороший" ответ, пока я не сделал ту же команду против хоста, который, как я знаю, открыл этот порт. Это для пакетного файла в Windows, который проверяет состояние удаленного порта, а затем запускает команду, которая использует этот удаленный порт для получения информации, затем команду проверки удаленного порта снова, а затем команду, которая использует этот порт на следующем сервере для получения информации, и так далее. Я повсюду смотрел и думал, что пинг может это сделать, но должны быть разные версии ping, я полагаю, что сервер, на котором я это делаю, не показывает эту опцию.

Просто для усмешки я попробовал веб-интерфейс удаленного контроля портов с веб-сайта - и результаты были верны как для "проблемного" сервера, так и для правильного сервера. Однако я не могу использовать это в пакетном запуске с более 500 IP-адресами сервера.

Есть ли что-то, что я могу сделать, это просто? Мои навыки Perl чрезвычайно ржавые (используйте его или теряйте), не знаю других языков на основе Windows, кроме партии. Unix - это мое умение, но это должно быть выполнено с Widows Server 2003.

Ответ 1

Кажется, вы ищете сканер портов, например nmap или netcat, оба из которых доступны для Windows, Linux и Mac OS X.

Например, проверьте telnet на известный ip:

nmap -A 192.168.0.5/32 -p 23

Например, найдите открытые порты от 20 до 30 на host.example.com:

nc -z host.example.com 20-30

Ответ 2

В командной строке вы можете использовать команду telnet.. Например, для подключения к IP 192.168.10.1 с портом 80,

telnet 192.168.10.1 80

Чтобы включить telnet в Windows 7 и выше щелкните. Из связанной статьи включите telnet через панель управления → программы и функции → функции Windows → telnet-клиент или просто запустите это в командной строке администратора:

dism /online /Enable-Feature /FeatureName:TelnetClient

Ответ 3

В сценариях я обнаружил, что команда curl может это сделать, например:

$ curl -s localhost:80 >/dev/null && echo Connected. || echo Fail.
Connected.
$ curl -s localhost:123 >/dev/null && echo Connected. || echo Fail.
Fail.

Возможно, он не будет работать не для всех служб, так как curl может возвращать разные коды ошибок в некоторых случаях (согласно комментарию), поэтому добавление следующего условия может работать надежно:

[ "$(curl -sm5 localhost:8080 >/dev/null; echo $?)" != 7 ] && echo OK || echo FAIL

Примечание. Добавлен -m5, чтобы установить максимальное время ожидания подключения 5 секунд.

Если вы также хотите проверить, действительно ли хост, вам нужно также проверить код выхода 6:

$ curl -m5 foo:123; [ $? != 6 -a $? != 7 ] && echo OK || echo FAIL
curl: (6) Could not resolve host: foo
FAIL

Чтобы устранить неисправный код ошибки, просто запустите: curl host:port, например:

$ curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused

Смотрите: man curl для полного списка кодов выхода.

Ответ 4

Нажмите Windows + R тип cmd и Enter

В командной строке введите

telnet "machine name/ip" "port number"

Если порт не открыт, появится следующее сообщение:

"Connecting To "machine name"...Could not open connection to the host, on port "port number":

В противном случае вы войдете в открытый порт (пока не отобразится пустой экран)

Ответ 5

Используйте команду nc,

nc -zv <hostname/ip> <port/port range>

For example,
nc -zv localhost 27017-27019
or
nc -zv localhost 27017

Вы также можете использовать команду telnet

telnet <ip/host> port

Ответ 6

nc или 'netcat' также имеет режим сканирования, который может быть полезен.

Ответ 7

Я думаю, что вы ищете Hping (http://www.hping.org/), который имеет версию Windows.

"Интерфейс вдохновлен ping (8) команда unix, но hping не только для отправки запросов эхо-запросов ICMP. Он поддерживает TCP, UDP, ICMP..."

Также очень полезно, если вы хотите увидеть, где по маршруту, который заблокирован TCP-порт (например, брандмауэром), где ICMP может не быть.

Ответ 8

В Bash вы можете использовать файлы псевдоустройства, которые могут открыть TCP-соединение с соответствующим сокетом. Синтаксис /dev/$tcp_udp/$host_ip/$port.

Вот простой пример, чтобы проверить, работает ли Memcached:

</dev/tcp/localhost/11211 && echo Port open || echo Port closed

Вот еще один тест, чтобы узнать, доступен ли конкретный сайт:

$ echo "HEAD / HTTP/1.0" > /dev/tcp/example.com/80 && echo Connection successful.
Connection successful.

Для получения дополнительной информации, проверьте: Расширенные Bash -Инструмент скриптов: Глава 29. /dev и /proc

Связано: Проверить, доступен ли порт в удаленной системе (без telnet) в SU