Баш: Взаимодействие процессов по трубам
СРЕДА: 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 ...
принимает некоторый ввод от пользователя, запустившего сценарий ожидания.