Почему «cat >> файл» не работает в zsh со вставленным текстом?

Как указал roaima , команды telnet будут обрабатывать ввод stdin, который вы перенаправили в цикл while. В результате, как только одно из telnet-соединений будет успешным, ваш цикл whileзавершится, потому что telnetсожрал остальную часть ввода, который вы ожидали передать while.

Непосредственным решением этой проблемы является перенаправление ввода telnetпроще всего из /dev/null, как прокомментировал Сайрус:telnet host port >> output.txt < /dev/null.

Чтобы отличить успешное соединение от (предположительно более 5-секундной задержки )отказа в соединении, я перехватил вывод команды telnet и проверил наличие сообщения « Connected to». Если это сообщение присутствует, мы предполагаем успех; в противном случае :отказ.

Основными изменениями в вашем скрипте были:

  1. перенаправление обоих telnetstdin из /dev/null
  2. цитирование всех переменных
  3. захват и проверка выходных данных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"

0
23.02.2021, 02:11
1 ответ

Если сначала вставить

cat >> test.txt

и нажмите Введите , а затем вставьте

This is a test.

, а затем

  • нажмите Введите , затем УправлениеD или
  • нажмите ControlDдва раза ,

вы получите результат, который вы ищете (в первом случае, с разрывом строки после ввода, а во втором случае без).


Если вставить напрямую

cat >> test.txt
This is a test.

, тогда вторая строка не будет использоваться как ввод cat, но она будет передана Zsh как вторая строка в вашей командной строке.

  • Если вы затем нажмете Enter , Zsh попытается выполнить обе строки соответственно, что приведет к zsh: command not found: This.
  • Если вы затем нажмете ControlD , Zsh попытается перечислить завершения для вас во второй строке, потенциально (, но не всегда ), что приведет кzsh: do you wish to see all 3734 possibilities (1867 lines)?(в зависимости от того, когда и где вы это делаете ).
1
18.03.2021, 22:28

Теги

Похожие вопросы