В старые времена мы telnet
видели, был ли открыт порт на удаленном хосте: telnet hostname port
пытались ли подключиться к любому порту на любом хосте и давали бы вам доступ к необработанному потоку TCP.
В настоящее время в системах, на которых я работаю, не установлен telnet (по соображениям безопасности), и все исходящие соединения со всеми хостами по умолчанию блокируются. Со временем легко потерять отслеживание того, какие порты открыты для каких хостов.
Есть ли другой способ проверить, открыт ли порт в удаленной системе - с использованием системы Linux с ограниченным числом установленных пакетов, и telnet
он недоступен?
linux
networking
port
Стив ХХХ
источник
источник
brew install telnet
. Поэтому я ожидаю, что пользователи Linux могут сделать то же самое сyum
иapt-get
.Ответы:
Некоторое время Bash мог получить доступ к портам TCP и UDP . Со страницы руководства:
Таким образом, вы можете использовать что-то вроде этого:
Таа Даа!
источник
cat < /dev/tcp/localhost/22
, вы должны получить свой заголовок sshd. Очевидно, что ваш процесс на порту 18080 ждет чего-то, прежде чем что-то отправлять. Порт 22 ( SSH ) приветствует вас с его версией и еще много чего. Попробуйте!Красиво и многословно! Из справочных страниц.
Один порт:
Несколько портов:
Диапазон портов:
источник
nc -zv 127.0.0.1 22,80,8080,20-30,443-446
(nc Версия: 1.107-4).Netcat - полезный инструмент:
nc 127.0.0.1 123 &> /dev/null; echo $?
Выводит,
0
если порт 123 открыт и1
если он закрыт.источник
telnet
также отказалисьnc
(хотя, как ни странно, нетcurl
или нетwget
).FOR
утверждениям начаться!-G 2
было бы более подходящим для тайм-аута TCPСамый простой способ, без использования другого инструмента, такого как
socat
, описан в ответе @ lornix выше. Это просто для того, чтобы добавить фактический пример того, как можно использовать psuedo-устройство/dev/tcp/...
в Bash, если вы хотите, скажем, проверить, есть ли у другого сервера данный порт, доступный через командную строку.Примеры
Скажем, у меня есть хост в моей сети с именем
skinner
.Причина, по которой вы хотите заключить их
echo > /dev/...
в круглые скобки,(echo > /dev/...)
заключается в том, что если вы этого не сделаете, то при проверке неработающих подключений вы получите сообщения такого типа.Они не могут быть просто перенаправлены,
/dev/null
поскольку они исходят из попытки записать данные на устройство/dev/tcp
. Таким образом, мы фиксируем все эти выходные данные внутри подкоманды, то есть(...cmds...)
и перенаправляем выходные данные подкоманды.источник
Я обнаружил, что это
curl
может выполнить работу аналогичным образомtelnet
иcurl
даже скажет вам, какой протокол ожидает слушатель.Создайте URI HTTP из имени хоста и порта в качестве первого аргумента для
curl
. Если выcurl
можете подключиться, он сообщит о несоответствии протокола и завершит работу (если слушатель не является веб-службой). Еслиcurl
не удается подключиться, время ожидания истекло.Например, порт 5672 на хосте 10.0.0.99 либо закрыт, либо заблокирован брандмауэром:
Однако из другой системы можно получить доступ к порту 5672 на хосте 10.0.0.99, и, по-видимому, на нем работает прослушиватель AMQP.
Важно различать разные сообщения: первый сбой произошел из-за
curl
невозможности подключения к порту. Второй сбой - это тест на успех, хотяcurl
ожидается прослушиватель HTTP вместо прослушивателя AMQP.источник
wget -qS -O- http://ip.add.re.ss:port
должен эффективно делать то же самое.curl myhost:22
,Надеюсь, это решит вашу проблему :)
источник
Вот одна строка:
используя синтаксис Bash, объясненный в ответе @lornix .
Для получения дополнительной информации проверьте: Расширенное руководство по написанию сценариев Bash: Глава 29.
/dev
и/proc
.источник
Я боролся целый день, потому что ни один из этих ответов, казалось, не работал для меня. Проблема в том, что самая последняя версия
nc
больше не имеет-z
флага, в то время как прямой доступ через TCP (как согласно @lornix и @slm) завершается неудачно, когда хост недоступен. В конце концов я нашел эту страницу , где я нашел не один, а два рабочих примера:nc -w1 127.0.0.1 22 </dev/null
(
-w
флаг заботится о времени ожидания, а флаг</dev/null
заменяет-z
)timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'
(
timeout
команда заботится о таймауте, а остальное от @slm)Затем просто используйте
&&
и / или||
(или даже$?
), чтобы извлечь результат. Надеюсь, кто-нибудь найдет эту информацию полезной.источник
Комбинируя ответы @kenorb и @Azukikuru, вы можете проверить открытый / закрытый / пожарный порт.
Другой подход с curl для достижения любого порта
источник
Вот функция, которая выберет один из методов в зависимости от того, что установлено в вашей системе:
источник
Это не должно быть доступно на вашей коробке, но попробуйте с
nmap
.источник
nmap
хороший инструмент, но не доступен в этих системах. Вместо того, чтобы скачатьnmap
, скомпилировать его, установить в мой домашний каталог, а затем скопировать его на все другие системы, я надеялся найти способ, используя существующие инструменты, доступные в большинстве установок Linux.для справки, расширив ответ @peperunas:
способ использовать Nmap для тестирования, это:
(пример выше использует localhost для демонстрационных целей)
источник
Если вам нужно тестировать больше, чем в системе, вы можете использовать наш инструмент тестирования dda-serverpec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) для таких задач. Вы можете определить свои ожидания
и протестируйте эти ожидания как против локального хоста, так и против удаленного хоста (подключитесь по ssh). Для удаленных тестов вы должны определить цели:
Вы можете запустить тест с
java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
Под капотом мы используем netcat, как описано выше ...
источник