2

我想制作一个脚本来启动一个程序,然后向它发送键输入。在伪脚本中:

#!/bin/bash
./program << (PRESS CONTROL-Z)

该程序正在运行,因此如果脚本中有其他命令,除非说 control-z 终止程序,否则将无法访问它们。

这可能吗?根据我的发现,我认为它可能需要密钥,但我可能是错的。

4

4 回答 4

2

我认为这可能是比“期望”更好的解决方案,因为它可以在本机 bash 脚本中执行,我很想看看你的想法。

利用

`printf "character code here"` 

注意反引号

因此,例如,我编写了一个控制远程 gnu 屏幕会话的脚本,以下行打开窗口 2 并发出 ctrl-c 组合键

ssh -t user@$host screen -p 2 -X stuff `printf "\003"`
  • -t 选项模拟远程机器上的终端输入
  • -p 允许我们指定我们在屏幕会话中连接的窗口的名称或编号。
  • \003 是字符代码 0x03 的 bash 格式

有关代码的完整参考,请参见此处

要查找某些键输入的代码,您可以使用

printf "%#x\n" "'X"
0x58
  • 如果 X 是您想要找到的代码的关键
  • 要查找非文字的代码,您可以使用 ctrl-v (使 bash 将下一个键附加到命令行而不是解释它)然后键入组合键,所以如果我想找到 ctrl-c 的键码,我会删除 X 按 ctrl-v 然后按 ctrl-c。

最后一件事上面提到的ascii代码参考将0x13列为回车符,但在屏幕手册中他们将0x15列为输入键代码,有人知道为什么吗?我已经在本地屏幕上进行了测试,当我按 Enter 键时会生成 0x13,但是当通过 ssh 向远程屏幕发送命令时,0x13 不起作用,但 0x15 可以。

希望有帮助

码头

于 2010-09-14T19:42:21.343 回答
1

您可能正在寻找expect(来自http://expect.nist.gov/)。这处理了伪 tty 的复杂性,使程序看起来脚本的输入(在这种情况下,expect程序)来自终端。

或者,您可以使用echocat将其输出通过管道传输到程序中——这取决于程序。

于 2010-04-11T04:11:47.230 回答
0

如果您只想让程序在后台启动,只需执行

#!/bin/bash
./program&
于 2010-04-11T04:12:01.473 回答
0

如果您的意图是后台程序,请使用:

./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>

于 2010-04-11T04:21:20.833 回答