Как указал roaima , команды telnet будут обрабатывать ввод stdin, который вы перенаправили в цикл while
. В результате, как только одно из telnet-соединений будет успешным, ваш цикл while
завершится, потому что telnet
сожрал остальную часть ввода, который вы ожидали передать while
.
Непосредственным решением этой проблемы является перенаправление ввода telnet
проще всего из /dev/null, как прокомментировал Сайрус:telnet host port >> output.txt < /dev/null
.
Чтобы отличить успешное соединение от (предположительно более 5-секундной задержки )отказа в соединении, я перехватил вывод команды telnet и проверил наличие сообщения « Connected to
». Если это сообщение присутствует, мы предполагаем успех; в противном случае :отказ.
Основными изменениями в вашем скрипте были:
telnet
stdin из /dev/null else
-telnet
для сравнения Обновленный скрипт:
#!/bin/bash
while IFS=";" read -r host ports
do
eval "arr=($ports)"
for port in "${arr[@]}";
do
echo "connecting to $host on port $port" >> output.txt
timeout 5s telnet "$host" "$port" < /dev/null
exit_status=$?
if [[ "$exit_status" -eq 124 ]]; then
echo "$host on $port has timed out" >> output.txt
else
output="$(telnet "$host" "$port" 2>&1 < /dev/null)"
case $output in
(*Connected\ to\ *)
echo "connection is successful to $host $port" >> output.txt
;;
(*)
echo "connection was refused to $host $port" >> output.txt
;;
esac
fi
echo "---------------------------------------------" >> output.txt
done
done < "$1"
Если сначала вставить
cat >> test.txt
и нажмите Введите , а затем вставьте
This is a test.
, а затем
вы получите результат, который вы ищете (в первом случае, с разрывом строки после ввода, а во втором случае без).
Если вставить напрямую
cat >> test.txt
This is a test.
, тогда вторая строка не будет использоваться как ввод cat
, но она будет передана Zsh как вторая строка в вашей командной строке.
zsh: command not found: This
. zsh: do you wish to see all 3734 possibilities (1867 lines)?
(в зависимости от того, когда и где вы это делаете ).