Найти в Дзене
ИТ разнообразно

Прекратите использовать Telnet для тестирования портов. Часть 3.

Вы можете сделать это и в Bash тоже Затем вы можете решить, что написание проверки TCP-порта на Bash вполне приемлемо: #!/bin/bash -e # Poor man TCP port scanner with Bash # Author: Jose Vicente Nunez <@josevnz@fosstodon.org> if [ -n "$1" ] && [ -f "$1" ]; then while read -r line; do machine=$(echo "$line"| /bin/cut -d' ' -f1)|| exit 100 ports=$(echo "$line"| /bin/cut -d' ' -f2)|| exit 101 OLD_IFS=$OLD_IFS IFS="," for port in $ports; do if (echo >/dev/tcp/"$machine"/"$port") >/dev/null 2>&1; then echo "OK: $machine -> $port" else echo "ERROR: $machine -> $port" fi done IFS=$OLD_IFS done < "$1" else echo "ERROR: Invalid or missing data file!" exit 103 fi Чистый скрипт Bash работает почти так же, как версия Expect: $ ./tcp_port_scan.sh port_scan.csv OK: google.com -> 80 OK: amazon.com -> 80 OK: raspberrypi -> 22 OK: raspberrypi -> 9090 OK: raspberrypi -> 8086 ERROR: raspberrypi -> 21 OK: dmaf5 -> 22 ERROR: dmaf5 -> 80

Вы можете сделать это и в Bash тоже

Затем вы можете решить, что написание проверки TCP-порта на Bash вполне приемлемо:

#!/bin/bash -e
# Poor man TCP port scanner with Bash
# Author: Jose Vicente Nunez <@josevnz@fosstodon.org>
if [ -n "$1" ] && [ -f "$1" ]; then
while read -r line; do
machine=$(echo "$line"| /bin/cut -d' ' -f1)|| exit 100
ports=$(echo "$line"| /bin/cut -d' ' -f2)|| exit 101
OLD_IFS=$OLD_IFS
IFS=","
for port in $ports; do
if (echo >/dev/tcp/"$machine"/"$port") >/dev/null 2>&1; then
echo "OK: $machine -> $port"
else
echo "ERROR: $machine -> $port"
fi
done
IFS=$OLD_IFS
done < "$1"
else
echo "ERROR: Invalid or missing data file!"
exit 103
fi

Чистый скрипт Bash работает почти так же, как версия Expect:

$ ./tcp_port_scan.sh port_scan.csv
OK: google.com -> 80
OK: amazon.com -> 80
OK: raspberrypi -> 22
OK: raspberrypi -> 9090
OK: raspberrypi -> 8086
ERROR: raspberrypi -> 21
OK: dmaf5 -> 22
ERROR: dmaf5 -> 80

Он работает быстрее, чем версия с использованием Expect, потому что не требует создания отдельных сессий Telnet, но обработка ошибок сложна. Кроме того, он не справляется хорошо с фильтрованными портами.

Какие-нибудь другие варианты?

Например, что если вы хотите проверить соединение с хостом, находящимся за брандмауэром?

Продолжение следует...

Перевод с некоторыми авторскими заголовками.

Автор оригинала: Jose Vicente Nunez (Sudoer).