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

В старые времена, мы использовали telnet чтобы увидеть, если порт на удаленном хосте была открыта: telnet hostname port попытается подключиться к любому порту на любом Хосте и предоставит вам доступ к необработанному потоку TCP.

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

есть другой способ проверить, если порт на удаленная система открыта - используется система Linux с ограниченным количеством установленных пакетов, и telnet нет в наличии?

6
задан Steve HHH
04.02.2023 20:36 Количество просмотров материала 3328
Распечатать страницу

11 ответов

Баш смог получить доступ к TCP и UDP порты на некоторое время. Из man-страницы:

/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a UDP connection to the corresponding socket.

Так что вы могли бы использовать что-то вроде этого:

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

Таа Даа!

228
отвечен lornix 2023-02-06 04:24

хороший и подробный! Из Man-страниц.

Одиночный порт:

nc -zv 127.0.0.1 80

несколько портов:

nc -zv 127.0.0.1 22 80 8080

диапазон портов:

nc -zv 127.0.0.1 20-30
319
отвечен Subhranath Chunder 2023-02-06 06:41

Netcat-полезный инструмент:

nc 127.0.0.1 123 &> /dev/null; echo $?

выводит 0 если открыт порт 123, и 1 если он закрыт.

96
отвечен thnee 2023-02-06 08:58

самый простой метод, без использования другого инструмента, такого как socat, как описано в ответе @lornix выше. Это просто, чтобы добавить фактический пример того, как можно было бы использовать псевдо-устройства /dev/tcp/... в Bash, если вы хотите, скажем, проверить, есть ли у другого сервера данный порт, доступный через командную строку.

примеры

Допустим, у меня есть хост в сети с именем skinner.

$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
    && echo "It's up" || echo "It's down"
It's up

$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
    echo "It's up" || echo "It's down"
It's down

причина, по которой вы хотите обернуть echo > /dev/... in скобки вроде этой,(echo > /dev/...) потому что если нет, тогда с тестами подключений вниз, вы будете получать такие сообщения появляться.

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

они не могут быть просто перенаправлены на /dev/null так как они приходят от попытки записать данные на устройство /dev/tcp. Таким образом, мы фиксируем все эти выходные данные в под-команде, т. е. (...cmds...) и перенаправить вывод подкоманды.

51
отвечен slm 2023-02-06 11:15

я нашел это curl может получить работу аналогично telnet и curl даже скажет вам, какой протокол ожидает слушатель.

построить HTTP URI из имени хоста и порта в качестве первого аргумента curl. Если curl can connect, он сообщит о несоответствии протокола и выходе (если слушатель не является веб-службой). Если curl не удается подключиться, истекает время ожидания.

например, порт 5672 на узле 10.0.0.99 закрыт или заблокирован с помощью брандмауэра:

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

однако, из другой системы, порт 5672 на хосте 10.0.0.99 может быть достигнут, и, кажется, работает слушатель AMQP.

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

важно различать разные сообщения: первая ошибка была из-за curl не удалось подключиться к порту. Второй провал-это тест на успех, хотя curl ожидается прослушиватель HTTP вместо прослушивателя AMQP.

36
отвечен Steve HHH 2023-02-06 13:32
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

надеюсь, что это решит вашу проблему :)

8
отвечен Mohammad Shahid Siddiqui 2023-02-06 15:49

вот один-лайнер:

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

используя синтаксис Баша объяснил в @lornix ответ.

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

7
отвечен kenorb 2023-02-06 18:06

я боролся целый день, потому что ни один из этих ответов, казалось, не работал для меня. Проблема в том, что самая последняя версия nc уже нет -z флаг, в то время как прямой доступ через TCP (как в соответствии с @lornix и @slm) терпит неудачу, когда хост не доступен. Я в конце концов нашел на этой странице, где я, наконец, нашел не один, но два примеры:

  1. nc -w1 127.0.0.1 22 </dev/null

    (том -w флаг берет тайм-аут, и </dev/null заменяет -z флаг)

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    (том timeout команда позаботится о таймауте, а остальное от @slm)

тогда просто используйте && и/или || (или даже $?) для извлечения результата. Надеюсь, кто-нибудь найдет эту информацию полезной.

6
отвечен Azukikuru 2023-02-06 20:23

Он не должен быть доступен на вашем боксе, но попробуйте с nmap.

2
отвечен peperunas 2023-02-06 22:40

объединение ответов из @kenorb и @Azukikuru вы можете проверить порт открыт/закрыт/firewalled.

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

другой подход с curl для достижения любого порта

curl telnet://127.0.0.1:22
0
отвечен Miguel Ferreira 2023-02-07 00:57

Если вы для проверки более чем на Система вы можете использовать нашу тестовую утилиту ДДА-serverspec (https://github.com/DomainDrivenArchitecture/dda-serverspec-crate) для таких задач. Вы можете определить ваши ожидания

{:netcat [{:host "mywebserver.com" :port "443"}
          {:host "telnet mywebserver.com" :port "80"}
          {:host "telnet mywebserver.com" :port "8443"}]}

и проверить эти ожидания либо против localhost или против удаленных хостов (подключение по ssh). Для удаленных тестов необходимо определить цели:

{:existing [{:node-name "test-vm1"
             :node-ip "35.157.19.218"}
            {:node-name "test-vm2"
             :node-ip "18.194.113.138"}]
 :provisioning-user {:login "ubuntu"}}

вы можете запустить тест с java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

под капотом мы используем netcat как указано выше ...

0
отвечен jerger 2023-02-07 03:14

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх