我需要在无头环境中模拟击键。
全部xte
和xdotool
许多C++
设计用于 X11 窗口
我试过 xdotool,它会抛出一些错误:
xdotool type "aaaaa"
Error: Can't open display: (null)
Failed creating new xdo instance
我知道Xvfb
但正在寻找其他可能的解决方法
我需要在无头环境中模拟击键。
全部xte
和xdotool
许多C++
设计用于 X11 窗口
我试过 xdotool,它会抛出一些错误:
xdotool type "aaaaa"
Error: Can't open display: (null)
Failed creating new xdo instance
我知道Xvfb
但正在寻找其他可能的解决方法
为了让应用程序接收任何击键,它必须从某个地方接收它们。通常只有两个选项是通过窗口或通过 TTY。如何模拟击键取决于两者中的哪一个。
透过一扇窗户
如果应用程序通过窗口接收击键,那么模拟它们
xdotool
是完成这项工作的正确工具。您只需要设置适当的DISPLAY
变量,以便xdotool
连接到与应用程序相同的 X 服务器。通过虚拟 TTY
许多程序会在虚拟 TTY 中调用 shell。
xterm
,sshd
,script
,screen
是一些典型的例子。创建虚拟 TTY 的程序可以通过在虚拟 TTY 的控制端上写来向 TTY 发送任何击键。如果它是
xterm
或任何类似的终端仿真器,模拟击键的方法将是通过如上所述的窗口来完成。在列表的其余部分中,我所知道的唯一具有模拟击键功能的程序是
screen
. 您可以在这样的会话中将击键发送到任何命名窗口screen
(实际示例,我经常使用):这里
screen -X
将连接到正在运行的屏幕并调用命令。at alsamixer
将导致在名为 的窗口中调用命令的其余部分alsamixer
。stuff 2
将模拟按2。需要注意的一个警告是,仅当
screen
会话当前从某个地方附加时,上述内容才有效。我不知道如何使它在分离的screen
.通过硬件 TTY
您可以让硬件发送实际的击键。如果是串行线路,您可以通过将按键写入线路另一端计算机上的串行端口来发送按键。如果它是本地控制台,您可以将一块硬件连接为真正的键盘(我确信可以找到可以执行此操作的 USB 设备。)
对于 Linux,存在驱动程序,可以在本地控制台上模拟击键,就好像它们来自实际硬件一样。