我想制作一个脚本来启动一个程序,然后向它发送键输入。在伪脚本中:
#!/bin/bash
./program << (PRESS CONTROL-Z)
该程序正在运行,因此如果脚本中有其他命令,除非说 control-z 终止程序,否则将无法访问它们。
这可能吗?根据我的发现,我认为它可能需要密钥,但我可能是错的。
我认为这可能是比“期望”更好的解决方案,因为它可以在本机 bash 脚本中执行,我很想看看你的想法。
利用
`printf "character code here"`
注意反引号
因此,例如,我编写了一个控制远程 gnu 屏幕会话的脚本,以下行打开窗口 2 并发出 ctrl-c 组合键
ssh -t user@$host screen -p 2 -X stuff `printf "\003"`
有关代码的完整参考,请参见此处。
要查找某些键输入的代码,您可以使用
printf "%#x\n" "'X"
0x58
最后一件事上面提到的ascii代码参考将0x13列为回车符,但在屏幕手册中他们将0x15列为输入键代码,有人知道为什么吗?我已经在本地屏幕上进行了测试,当我按 Enter 键时会生成 0x13,但是当通过 ssh 向远程屏幕发送命令时,0x13 不起作用,但 0x15 可以。
希望有帮助
码头
您可能正在寻找expect
(来自http://expect.nist.gov/)。这处理了伪 tty 的复杂性,使程序看起来脚本的输入(在这种情况下,expect
程序)来自终端。
或者,您可以使用echo
或cat
将其输出通过管道传输到程序中——这取决于程序。
如果您只想让程序在后台启动,只需执行
#!/bin/bash
./program&
如果您的意图是后台程序,请使用:
./program & # The & sends the command to the background
echo commands here are executed while program is in the background
…
wait # Wait for the completion of background commands
echo commands here are executed after background program has completed
编辑:如果您的意图是停止程序(就像 ctrl-Z 在 *nix shell 中经常做的那样),您可以向它发送 STOP 信号:
kill -STOP pid
要恢复执行,向它发送 CONT 信号:
kill -CONT pid
在每个示例pid
中都是程序的进程 ID。如果你在脚本中启动它,很容易得到变量$!
,例如
./prog &
echo prog started in the background
pid_of_prog=$!
kill -STOP $pid_of_prog
echo prog stopped
kill -CONT $pid_of_prog
echo prog continues
wait
echo prog finished
编辑 2:如果您的程序是在收到 ctrl-Z 字符时退出的程序,请记住控制字符具有字母表中位置字母的数值(即 Ctrl-A 为 1,Ctrl-B 为 2, ETC。)。要将此字符发送到程序,您可以:
echo -e "\032" | ./prog
(032
是 26,即 ^Z,以八进制表示。当然,您可以通过任何方式生成相同的字符,也许将其添加到其他输入的末尾,例如( cat inputfile ; echo -e "\032" ) | ./prog
.
但这可能不一定有效;程序必须设计为从输入中识别这个字符(它可能不会);通常外壳会捕获它。再说一次,大多数程序在输入结束时才从退出中读取输入stdin
,因此重定向任何有限输入(偶数</dev/null
)应该会导致它终止。
最后,如果意图是在发生其他事件(在脚本的其他地方检测到)时停止程序的执行,您可以kill
这样做……</p>