在无头环境中模拟击键

在无头环境中模拟击键

我需要在无头环境中模拟击键。

所有xtexdotool其中许多C++设计用于与 X11 窗口配合使用

我尝试过 xdotool,但它抛出了一些错误:

xdotool type "aaaaa"
Error: Can't open display: (null)
Failed creating new xdo instance

我知道,Xvfb但正在寻找其他可能的解决方法

答案1

应用程序要想接收任何按键,必须从某个地方接收。通常只有两个选项:通过窗口或通过 TTY。如何模拟按键取决于是这两种情况中的哪一种。

透过窗户

如果应用程序通过窗口接收按键,那么模拟按键xdotool就是完成这项工作的正确工具。您只需设置适当的DISPLAY变量,以便xdotool连接到与应用程序相同的 X 服务器。

通过虚拟 TTY

许多程序会在虚拟 TTY 中调用 shell。xtermsshdscript就是screen一些典型的例子。创建虚拟 TTY 的程序可以通过在虚拟 TTY 的控制端写入来将任何击键发送到 TTY。

如果它是xterm或任何类似的终端仿真器,模拟击键的方式是通过上面描述的窗口来进行。

从列表的其余部分来看,我知道的唯一具有模拟击键功能的程序是screen。您可以将击键发送到screen会话中的任何命名窗口,如下所示(实际示例,我经常使用):

screen -X at alsamixer stuff 2

这里screen -X将连接到一个正在运行的屏幕并调用一个命令。at alsamixer将导致在名为的窗口中调用其余命令alsamixerstuff 2将模拟按下2

需要注意的是,上述操作仅在screen会话当前从某处附加时才有效。我不知道如何让它在分离的 上工作screen

通过硬件 TTY

您可以让硬件发送实际的按键。如果是串行线,您可以通过将按键写入线路另一端的计算机串行端口来发送按键。如果是本地控制台,您可以让一块硬件连接起来作为真正的键盘(我相信可以找到可以做到这一点的 USB 设备。)

对于 Linux 来说,存在驱动程序,它可以在本地控制台上模拟按键,就像来自实际硬件一样。

相关内容