Bash: 进程之间通过管道相互交互
Bash: Mutual interaction of processes via pipes
环境: Linux/Docker,bash 版本 4.2。
问题:
server-app
通过交互式 shell. 接受命令
server-app
通过管道接收来自 client.sh
的命令。
server-app
写入 client.sh
接收到的标准输出。
client.sh
考虑 server-app
的输出以确定进一步的命令。
server-app
可能还会要求输入密码 => 也就是说,终端的标准输入必须连同 client.sh
. 的输出一起转发到 server-app
我尝试了 coproc
的多种设置。但是,我要么 运行 陷入停滞状态,要么
没有收到数据。如何在 bash
中实现如下所示的设置?
.------>------------------------.
.---------. | .------------. stdin | .-----------.
| user |-------' | server-app |<-------+-------| client.sh |
| console |<--+-------------| | .--------->| |
'---------' | stdout '------------' | '-----------'
'--------------------------------'
我的尝试:
coproc server.app
function expect { local expectation=
# 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=
# 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")
最后三行仅演示了对[=13=]的可能处理
输出。这又有什么问题呢?怎么才能发挥作用。
如@sexpect 所述,'natural' 解决问题的方法是 expect。此工具将基于 Tcl 的脚本作为输入。
spawn server-app
将在 expect 的控制下启动 server-app
。 expect
也是这些脚本中的关键字。
expect -re "something (..)"
等待匹配表达式 something (..)
.
的输出
send ...
向应用程序发送一些字符。
expect_tty ...
从启动 expect 脚本的用户那里获取一些输入。
环境: Linux/Docker,bash 版本 4.2。
问题:
server-app
通过交互式 shell. 接受命令
server-app
通过管道接收来自client.sh
的命令。server-app
写入client.sh
接收到的标准输出。client.sh
考虑server-app
的输出以确定进一步的命令。server-app
可能还会要求输入密码 => 也就是说,终端的标准输入必须连同client.sh
. 的输出一起转发到
server-app
我尝试了 coproc
的多种设置。但是,我要么 运行 陷入停滞状态,要么
没有收到数据。如何在 bash
中实现如下所示的设置?
.------>------------------------.
.---------. | .------------. stdin | .-----------.
| user |-------' | server-app |<-------+-------| client.sh |
| console |<--+-------------| | .--------->| |
'---------' | stdout '------------' | '-----------'
'--------------------------------'
我的尝试:
coproc server.app
function expect { local expectation=
# 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=
# 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")
最后三行仅演示了对[=13=]的可能处理 输出。这又有什么问题呢?怎么才能发挥作用。
如@sexpect 所述,'natural' 解决问题的方法是 expect。此工具将基于 Tcl 的脚本作为输入。
spawn server-app
将在 expect 的控制下启动 server-app
。 expect
也是这些脚本中的关键字。
expect -re "something (..)"
等待匹配表达式 something (..)
.
send ...
向应用程序发送一些字符。
expect_tty ...
从启动 expect 脚本的用户那里获取一些输入。