Я хочу проверить, открыты ли определенные порты на хосте. Я использую:
nc -z host 22
nc -z host 80
nc -z host 443
nc -z host 8080
который работает, но было бы неплохо использовать однострочник, например:
nc -z host 22 80 443 8080
что не работает.
Я бы хотел избежать диапазона портов nc -z host 22-8080
как указано на странице руководства, если это возможно, так как есть большой пробел в номерах портов, которые я хочу проверить. Кроме того, я не хочу сканировать каждый порт, чтобы меня воспринимали как сканирование открытых портов.
Если не считать цикла bash, каковы мои варианты тестирования, если порты открыты? У меня есть десятки хостов, на каждом из которых есть несколько портов, которые нужно проверить.
Я использую -w 1
ниже, чтобы ограничить время ожидания до 1 секунды. Я также использую -v
по причинам, указанным в комментариях. я использовал -n
чтобы отказаться от задержек при обратном поиске DNS ...
[mpenning@tsunami ~]$ for i in $(echo "172.16.1.1,172.16.1.5"|tr "," "\n"); do echo -e "22\n80\n443\n8080" | xargs -i nc -w 1 -zvn $i {}; done
(UNKNOWN) [172.16.1.1] 22 (ssh) open
(UNKNOWN) [172.16.1.1] 80 (www) : Connection timed out
(UNKNOWN) [172.16.1.1] 443 (https) open
(UNKNOWN) [172.16.1.1] 8080 (http-alt) : Connection timed out
(UNKNOWN) [172.16.1.5] 22 (ssh) open
(UNKNOWN) [172.16.1.5] 80 (www) open
(UNKNOWN) [172.16.1.5] 443 (https) open
(UNKNOWN) [172.16.1.5] 8080 (http-alt) : Connection refused
[mpenning@tsunami ~]$
Если хочешь GNU Parallel как и я, попробуйте это:
parallel nc -vz host ::: 22 80 443 8080
Пример вывода:
Connection to foo.example.com 22 port [tcp/ssh] succeeded!
nc: connect to foo.example.com port 80 (tcp) failed: Connection refused
nc: connect to foo.example.com port 443 (tcp) failed: Connection refused
nc: connect to foo.example.com port 8080 (tcp) failed: Connection refused
Этот метод также в некоторых случаях быстрее, поскольку он тестирует подключение к портам параллельно, а не последовательно. В частности, здесь удаленный хост (или промежуточный брандмауэр) отбрасывает ваши пакеты, чтобы оставаться незаметным (в отличие от успешного соединения или принудительного отклонения).
Наконечник: в большинстве дистрибутивов Linux вы можете установить parallel
из вашего менеджера пакетов.
Обновить: С участием parallel
, это очень хорошо обобщается, чтобы покрыть часто необходимый случай нескольких хостов x несколько портов. В следующем примере используется parallel
для перебора перекрестного произведения, поэтому вам не нужно писать какие-либо вложенные циклы.
parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080
Вывод:
Connection to host1 22 port [tcp/ssh] succeeded!
Connection to host1 80 port [tcp/http] succeeded!
Connection to host1 443 port [tcp/https] succeeded!
nc: connect to host1 port 8080 (tcp) failed: Connection refused
Connection to host2 22 port [tcp/ssh] succeeded!
nc: connect to host2 port 80 (tcp) failed: Connection refused
nc: connect to host2 port 443 (tcp) failed: Connection refused
nc: connect to host2 port 8080 (tcp) failed: Connection refused
Connection to host3 22 port [tcp/ssh] succeeded!
nc: connect to host3 port 80 (tcp) failed: Connection refused
nc: connect to host3 port 8080 (tcp) failed: Connection refused
nc: connect to host3 port 443 (tcp) failed: Connection refused
Как и в предыдущем примере, parallel
параллельно выполняет тесты подключения. Обратите внимание, что параллелизм по умолчанию - это количество потоков в вашей системе, но его можно легко переопределить с помощью -j
переключиться на любое значение. Вы могли бы легко уйти с parallel -j 50 ...
или даже выше, поскольку тестирование сокетов не требует интенсивной работы ЦП.
В Gentoo Linux (с установленным net-analyzer / netcat-110-r9):
$ nc -vz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open
$ nc -vvz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open
www.example.com [93.184.216.34] 443 (https) : Connection refused
Netcat на самом деле не является сканером, так как комментарий предполагает, что Nmap будет лучшим вариантом здесь. Не используя опцию диапазона портов, я полагаю, вам осталось обернуть ее в сценарий оболочки;
for host in $(cat hostlist); do
for port in $ports; do nc -z $host $port; done
done
и т.д..
В Redhat 6 вы можете запустить что-то вроде этого как настоящий однострочник:
nc -znv -w 2 <host> <port1>; nc -znv -w 2 <host> <port2>
-z тестирует порт
-n не разрешает DNS
-v дать подробный вывод
-w таймаут через 2 секунды
; ставит одну команду за другой, если вы не возражаете ввести ее снова.
Мне нравятся предложения по использованию цикла, если вы сканируете несколько портов, однако, если это 2 или 3, и вы уже пытаетесь просмотреть список с помощью чего-то вроде SSH, полезно использовать такие команды.