Баш: Взаимодействие процессов по трубам

СРЕДА: Linux / Docker, версия bash 4.2.

ВОПРОС:

  • принимает команды с интерактивной оболочкой.
  • получает команды, исходящие из канала.
  • записывает в стандартный вывод, полученный.
  • рассматривает вывод для определения дальнейших команд.
  • может также запросить пароль => То есть, стандартный ввод терминала должен быть перенаправлен вместе с выводом client.sh.

Я пробовал несколько настроек с coproc. Однако я либо попал в тупик, либо данные не были получены. Как можно реализовать такую ​​установку, как показано ниже, в bash?

                             .------>------------------------.
     .---------.       |         .------------.  stdin |       .-----------.
     | user    |-------'         | server-app |<-------+-------| client.sh |
     | console |<--+-------------|            |     .--------->|           |
     '---------'   |      stdout '------------'     |          '-----------'
                   '--------------------------------'

МОЯ ПОПЫТКА:

      coproc server.app

function expect { local expectation=$1
        # read from pipe until $expectation occurs in the input stream
        # when found, echo the line to 'stdout'
        echo "EXPECT: '$expectation'"
        while true; do
            read text <&"${COPROC[0]}"
            if [[ "$text" == *"$expectation"* ]]; then
                    echo $text 
                    break
            fi
        done
}

function send { local command=$1
        # send $command through pipe 
        echo "SEND: $command"
        echo "$command" >&"${COPROC[1]}"

}


expect "Conected to URL" 
send   "open"
expect "Session keepalive"
send   "session open"

# use the reported session identifier to setup the user command
session_n=$(expect "Identifier of Session created" | cut -d' ' -f5)    
command=$(echo "$user_command" | sed -e "s/SESSION/$session_n/g")

Последние три строки демонстрируют только возможную обработку server-appвывод. Опять же, что в этом плохого? Как его можно заставить работать.

1 ответ

Как отметил @sexpect, «естественным» способом решения проблемы является expect . Этот инструмент принимает в качестве входных данных сценарий на основе Tcl.

       spawn server-app

бы начать server-appпод контролем ожидания. expectтакже является ключевым словом в этих сценариях.

       expect -re "something (..)"

ожидает вывода, соответствующего выражению something (..).

       send ...

отправляет некоторые символы в приложение.

      expect_tty ...

принимает некоторый ввод от пользователя, запустившего сценарий ожидания.

Другие вопросы по тегам