Вы можете сделать это и в 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).