Проверьте состояние одного порта на удаленном хосте [закрыт]

158

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

Просто ради смеха, я попробовал веб-проверку удаленного порта с веб-сайта - и результаты были правильными как для «проблемного» сервера, так и для правильного сервера. Тем не менее, я не могу использовать это в пакетном запуске с 500+ IP-адресов серверов.

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

Росс Ридж
источник
5
Вы можете попробовать задать этот вопрос на serverfault.com
Джон Раш
1
Кто-то уже сделал это: serverfault.com/questions/309357/ping-a-specific-port
Вадим
1
Поскольку этот вопрос закрыт, я ответил здесь
npocmaka
окна ps> tnc xxx.xxx.xxx.xxx -port 161
Мусульманин Шахсаван

Ответы:

151

Похоже, вы ищете сканер портов, такой как 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
Гленн
источник
Оба из них доступны для Windows.
Гленн
1
ваша команда nmap должна содержать "-p23" без пробела. Nmap рассматривает каждую единицу, которой непосредственно не предшествует флаг, как отдельное место для сканирования
Брэндон Лебедев,
14
должно быть nc -zv host.example.com 20-30. в противном случае нет выхода
Арье Бейтц
1
Опция -zдля ncнедоступна в Linux.
valentin_nasta
1
@valentin_nasta да, возможно, в зависимости от того, какую версию netcat вы используете (gnu или openbsd). Вот соответствующая строка со страницы руководства для nc (версия openbsd) в моей системе Arch linux: -z Указывает, что nc должен просто сканировать прослушивающие демоны, не отправляя им никаких данных.
Ошибочно
126

В командной строке вы можете использовать команду 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
Это самый простой способ , если телнет установлен на устройстве Windows
shonky пользователя линукс
30
... и это занимает 2 секунды, чтобы добавить его в Windows (8.1 в моем случае)> Панель управления> Добавить программы> Включить функции Windows
Крис Мутрей
14
Просто для информации: если порт не открыт: Соединение с ##### ... Не удалось открыть соединение с хостом, на порту ####: Ошибка подключения; И если порт открыт, вы окажетесь в telnet (CTRL +], а затем
выйдите
27

Для сценариев я обнаружил, что 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полный список кодов выхода.

kenorb
источник
К сожалению, это не работает для меня (по крайней мере, на Bash в OS X).
Майк Атлас
1
Таможенный сервис. FWIW это вроде работает: curl $IP:$PORTyields: curl: (52) Empty reply from server(против curl: (7) Failed to connect), но очень похоже nc, я не могу | grep Emptyдля этих выходных операторов, как можно было ожидать (что-то о переводах строки или отсутствии немедленного вывода?). Я предполагаю, что ваша строка условно основана на коде выхода, верно? Я на Эль Капе; может быть, в других версиях или операционных системах состояние отказа выходит, -1а не 52?
Майк Атлас
Да, это сделало бы это. curl -s $IP:$PORT >/dev/null; if [ $? -eq 52 ]; then echo "Connected."; else echo "Fail."; fi
Майк Атлас
Вопрос был о Windows, которая явно не имеет, например, / dev / null
Артур Такка
@ArthurTacca Вы всегда можете использовать подсистему Windows для Linux (WSL).
Кенорб
23

Нажмите 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":

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

Лео
источник
7
Обратите внимание, что telnet не устанавливается по умолчанию в современных системах Windows. Вам нужно будет установить его с панели управления «Установка и удаление компонентов Windows».
Грег
1
@Greg или с помощью онлайн - инструмента, telnet-online.net
унц
2
@oz true, если только вы не проверяете статус внутреннего сервера
Грег
работает на Windows10
gaurav
19

Используйте команду 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
minhas23
источник
4

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

Каски
источник
3
На Mac "nc -zv server port-range"
Виджей Кумар
2

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

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

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

Настоящая кровь
источник
2

В 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) в SuperUser.

Дополнительные примеры см .: Как открыть сокет TCP / UDP в оболочке bash (статья).

kenorb
источник
1
Вау, это гений! Я не знаю, это возможно только с помощью bash. Это удобно для таких людей, как я, у которых на Windows установлен только git bash, и они не хотят устанавливать другой сервис.
доцлашлу