Из скрипта bash как быстро узнать, есть ли порт 445
/ прослушивается на сервере.
Я попробовал несколько вариантов, но я хочу что-то быстрое:
1. lsof -i :445
(занимает секунды)
2. netstat -an |grep 445 |grep LISTEN
(занимает секунды)
3. telnet
(не возвращается)
4. nmap
, netcat
недоступны на сервере
Было бы хорошо узнать способ, который не перечисляет сначала и greps после этого.
netstat -lnt
(с-t
и без-a
) ограничит вывод только прослушиванием TCP-соединений. Это может немного ускорить. Вы можете добавить-4
IPv4, только если вам не нужен IPv6.netstat -an | grep PORTNUMBER | grep -i listen
Если вывод пуст, порт не используется.lsof
это медленно для вас, но обычно это лучшее из перечисленных вами решений. Вашеnetstat
решение не очень надежно (вы можете угадать его всякий раз, когда используетеgrep
; в любом случае оно возвращает true, если кто-то слушает, например, 4450).telnet
и наnetcat
самом деле попытаться создать соединение, которое не всегда может быть тем, что вы хотите.Ответы:
Удивление, которое я недавно узнал, заключается в том, что Bash изначально поддерживает tcp-соединения в качестве дескрипторов файлов . Использовать:
Я использую 6 в качестве дескриптора файла, потому что 0,1,2 - это stdin, stdout и stderr. 5 иногда используется Bash для дочерних процессов , поэтому 3,4,6,7,8 и 9 должны быть безопасными.
В соответствии с комментарием ниже, чтобы проверить прослушивание на локальном сервере в сценарии:
Чтобы определить, слушает ли кто-то, попытайтесь подключиться с помощью обратной связи. Если это не удается, то порт закрыт или нам не разрешен доступ. После этого закройте соединение.
Измените это в своем случае, например, отправив электронное письмо, выйдя из сценария при сбое или запустив необходимую службу.
источник
/dev/tcp/IP/PORT
дереваЗдесь есть очень короткий термин «быстрый ответ»: как проверить, открыт ли удаленный порт TCP из сценария Shell?
Я использую его с 127.0.0.1 в качестве «удаленного» адреса.
возвращает «0», если порт открыт, и «1», если порт закрыт.
например
источник
Вы можете использовать netstat таким образом для более быстрых результатов:
В Linux:
На Mac:
Это выведет список процессов, прослушивающих порт (445 в этом примере), или ничего не выведет, если порт свободен.
источник
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
awk '$6 == "LISTEN" && $4 ~ "80$"'
. Вместо проверки точки перед номером порта с помощью\.80
я использовал80$
. В противном случае это также соответствует IP-адресам, содержащим.80
и порты, начинающиеся с80
таких как8000
.Вы можете использовать Netcat для этого.
подключается к серверу и снова напрямую закрывает соединение. Если netcat не может подключиться, он возвращает ненулевой код завершения. Код выхода хранится в переменной $ ?. Например,
вернет 0, если и только если netcat может успешно подключиться к порту.
источник
nc
имеет-z
флаг для этой цели, который не требует ввода от/dev/null
. Там уже ответ, используя-z
флаг выше.Основываясь на ответе Спенсера Рэтбуна, используя bash:
источник
: &>/dev/null </dev/tcp/127.0.0.1/$PORT
они перечислены в / proc / net / tcp.
это второй столбец после ":" в шестнадцатеричном виде:
так что я предполагаю, что один из них
:50
в третьем столбце должен быть stackoverflow: o)искать
man 5 proc
более подробную информацию. и выбор этого вместе с sed и т. д. оставлен как упражнение для нежного читателя ...источник
2 мс достаточно быстро?
Добавьте двоеточие, и это работает на Linux
источник
ss
даже немного быстрее, чемnc
.l
для прослушивания ,4
для IPv4;sport
обозначает (конечно) исходный порт . Приведенная выше команда предполагает наличие прослушиваемого TCP-порта (t
опция): использоватьu
опцию для UDP или ни один из них для обоих протоколов. Больше информацииss
как всегда на Nixcraft . ПРИМЕЧАНИЕ:ss
фильтры здесь не работают, не знаю почему (bash 4.3.11, утилита ss, iproute2-ss131122), должны идти с grep .ss
команда не возвращает код завершения, отражающий ее нахождение; он всегда возвращает 0 код выхода.| grep LISTEN
?State Recv-Q Send-Q Local Address:Port Peer Address:Port
и сейчас? Что это значит?Вот тот, который работает для Mac и Linux:
источник
[\\.\:]
.Где 8000 - номер порта. Если порт свободен, он запустит сервер, который вы можете легко закрыть. Если это не так, он выдаст ошибку:
источник
Я хотел проверить, открыт ли порт на одном из наших тестовых серверов Linux. Я смог сделать это, пытаясь соединиться с telnet с моей машины разработчика на тестовый сервер. На твоей девайс машине попробуй запустить:
В этом примере я хочу проверить, открыт ли порт 8080 на хосте test2.host.com
источник
tcping - отличный инструмент с очень низкими издержками. У него также есть аргумент тайм-аута, чтобы ускорить его:
источник
Вы также можете использовать команду netcat
или
-z - устанавливает nc для простого сканирования на предмет прослушивания демонов, без фактической отправки им данных.
-v - включает подробный режим.
источник
nmap
это правильный инструмент. Просто используйтеnmap example.com -p 80
Вы можете использовать его с локального или удаленного сервера. Это также поможет вам определить, блокирует ли доступ брандмауэр.
источник
Если вы используете iptables, попробуйте:
или
источник