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

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

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

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

8 ответов

Похоже, вы ищете сканер портов, такой как 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

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

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

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

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

telnet "machine name/ip" "port number"

Если порт не открыт, это сообщение будет отображаться:

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

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

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

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

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

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

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

В 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 (статья).

Другие вопросы по тегам