模拟无头环境中的击键

apa*_*jja 3 headless xvfb

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

所有xtexdotool以及许多C++设计用于 X11 窗口

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

xdotool type "aaaaa"
Error: Can't open display: (null)
Failed creating new xdo instance
Run Code Online (Sandbox Code Playgroud)

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

kas*_*erd 5

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

透过窗户

如果应用程序通过窗口接收击键,那么模拟它们xdotool是适合该工作的工具。您只需要设置适当的DISPLAY变量,以便xdotool连接到与应用程序相同的 X 服务器。

通过虚拟 TTY

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

如果是xterm或任何类似的终端模拟器,模拟击键的方法是通过上述窗口进行。

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

screen -X at alsamixer stuff 2
Run Code Online (Sandbox Code Playgroud)

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

需要注意的一个警告是,以上仅当screen会话当前从某处附加时才有效。我不知道如何让它在一个独立的screen.

通过硬件 TTY

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

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