在无头环境中模拟击键

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

所有的xdotoolxdotool和许多C++devise用来处理X11窗口

我试过xdotool,它会抛出一些错误:

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

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

为了让应用程序接收任何击键,它必须从某处接收它们。 通常只有两个选项是通过窗口或通过TTY。 如何模拟击键取决于哪一个是这种情况。

通过一个窗口

如果应用程序通过窗口接收按键,为了模拟它们, xdotool是正确的工具。 您只需要设置正确的DISPLAYvariables,以便xdotool连接到与应用程序相同的X服务器。

通过一个虚拟的TTY

很多程序将在虚拟TTY中调用一个shell。 xtermsshdscriptscreen都是一些典型的例子。 创build虚拟TTY的程序可以通过在虚拟TTY的控制端写入来向TTY发送任何击键。

如果是xterm或任何类似的terminal仿真器,模拟按键的方法是通过上述的窗口来完成。

从列表的其余部分,我知道的一个模拟击键function的程序是screen 。 您可以在screen会话中发送按键到任何命名的窗口,就像这样(我经常使用的实际例子):

 screen -X at alsamixer stuff 2 

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

需要注意的一点是,上述内容仅适用于screen会话当前从某处连接的情况。 我不知道如何使它在一个分离的screen

通过一个硬件TTY

你可以让硬件发送实际的击键。 如果是串行线路,则可以通过将其写入到线路另一端的计算机上的串行端口来发送击键。 如果它是一个本地控制台,你可以有一个硬件作为一个真正的键盘连接(我相信有可能findUSB设备,可以做到这一点)。

在Linux的情况下,有驱动程序,它们可以模拟本地控制台上的击键,就像它们来自实际的硬件一样。