屏幕、期望和脚本分离交互

屏幕、期望和脚本分离交互

尝试编写一个 bash 脚本,它将打开一个屏幕,启动一个 python 应用程序,并在首次启动时根据需要与 python 交互。

如果在屏幕上无法使用,我很乐意切换到 tmux 作为替代方案。我只是不太擅长编写 bash 脚本,也没有使用 expect 的经验。

以下是我目前所掌握的信息:

sent=blah
expexec=$(/usr/bin/expect -c "/usr/bin/python /opt/app.py expect \"Interaction:\" send \"$sent\r\" interact")
/usr/bin/screen -L -dmS spawner /bin/sleep 30
/bin/sleep 1
/usr/bin/screen -S spawner -X screen screen -L -dR myDaemon
/bin/sleep 1
/usr/bin/screen -S myDaemon -X detach
/usr/bin/screen -S myDaemon -X stuff "echo $expexec"
/usr/bin/screen -S spawner -X stuff "exit\r"

希望有人能帮助我……

以上是最新的迭代,我尝试将整个命令写入变量中,如另一个示例中所示。屏幕命令全部有效,但我无法让 expect 正确执行并查找输入队列并发送响应。

提前致谢,

杰高

答案1

为了防止这对其他人有所帮助,我想让每个人都知道我是如何实现这一点的。我只是将一个脚本分成两个,并将预期部分放在自己的脚本中。我的版本只使用了一个变量,但我想它很容易扩展。

期望脚本:

#!/usr/bin/expect
set timeout 60

set sent [lindex $argv 0]

spawn /usr/bin/python /opt/app.py

expect "Interaction:"

send "$sent\r";

interact

主要脚本:

#!/bin/sh

# variables
sent=blah
expectScript=/path/to/expect/script

# bash screen detachment foo
/usr/bin/screen -L -dmS spawner /bin/sleep 30
/bin/sleep 1
/usr/bin/screen -S spawner -X screen screen -L -dR myDaemon
/bin/sleep 1
/usr/bin/screen -S myDaemon -X detach

# sending the command to the screen
/usr/bin/screen -S myDaemon -X stuff "$expectScript $sent\r"

# close the screen spawner
/usr/bin/screen -S spawner -X stuff "exit\r"

杰高

相关内容