在 Bash 中发送模拟击键

在 Bash 中发送模拟击键

我最近一直在尝试编写一个可用于自动化我的 C++ 程序在 bash 中。如果您了解 AutoIt,我可以简单地向您展示我正在尝试做的一个示例:

send("1{enter}")

或者

send("!a")

OK 对于那些不懂 AutoIt 的人来说:

第一个例子发送一个模拟的“1”键击,然后是一个回车键(CR)

第二个示例发送 alt-a

我专门尝试这样做狂欢没有其他脚本语言可以做到这一点

另外,我会不是更喜欢用勺子喂食。请指定如何编写。不允许为我写剧本。

答案1

要将文本输入到程序的标准输入中,请使用管道和/或重定向

echo 1 | myprogram

(echo "First line"
 echo "Second line") | myprogram

myprogram <<EOF
First line
Second line
EOF

对于交互式 CLI 程序(不是全终端),可以使用命名管道或共同进程作为一种穷人的expect(由于是 Tcl 而被排除在外):

mkfifo in out
myprogram <in >out &
echo "First line" >in
read -r reply <out

mkfifo in out
myprogram <in >out &
exec {infd}>in {outfd}<out
echo "First line" >&$infd
read -r reply <&$outfd

coproc foo { myprogram; }
echo "First line" >&${foo[1]}
read -r reply <&${foo[0]}

(从输出管道读取时要小心;例如,head -1 <out不会只读取一行 - 它会缓冲一个完整的 4k 块,打印一行,丢弃其余部分。)

答案2

您正在寻找工具

xdotool 与您的示例命令等效的命令是:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

答案3

我最喜欢的是“tmux”。

警告 - 这里有些程度的灌输,尽管这个问题已经足够古老,原作者无疑已经完成了他们最初打算做的事情。

您可以轻松地在后台启动 tmux,启动应用程序。Tmux 提供了一个 API 来向应用程序发送按键,以及在您想要与应用程序交互时将应用程序连接到终端。

例子:

$ tmux new-session -d -s Super
$ tmux send-keys -t Super: "uuid" "Enter"
$ tmux capture-pane -t Super: -S - -E - -p | cat -n

$ uuid

fe253d00-3432-11eb-9984-cb225a8f7d48

$ tmux kill-session -t Super:

new-session -d -s SuperSuper创建一个名为“background”的新会话(-d)。注意-s,new-session 的名称为会议。我还没有命名要运行的应用程序,因此启动了一个 shell。

send-keys -t Super: "command" "Enter"发送按键。Tmux 可以识别许多关键字,例如 Enter、PgUp、Escape 等,否则send-keys -t Super: $'command\n'也可以通过发送 UTF 和原始代码。请注意,-t指的是目标其中包括[session]:[window id]:[pane #]。由于我只有默认窗口和窗格,因此我将它们留空并仅引用会话。如果我知道没有其他会话正在运行,我可以-t完全省略。

capture-pane -t Super: -S [start] -E [end] -p复制窗口的内容。默认情况下,窗格会被捕获到内部缓冲区,您可以将其保存或粘贴到其他窗口。这-p会导致内容被传输到屏幕上。请注意,捕获的数据可能比整个屏幕长得多。

最好的部分是,如果您让应用程序或会话保持运行,tmux attach -t Super:它将把您带入正在运行的会话,以便您可以与该应用程序进行交互。

许多人使用 tmux 来启动长时间运行的交互式程序,作为他们以后可以附加的后台服务,或作为自动化测试解决方案的一部分。

相关内容