我需要在无头环境中模拟击键。
所有xte
,xdotool
其中许多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。xterm
、sshd
、script
就是screen
一些典型的例子。创建虚拟 TTY 的程序可以通过在虚拟 TTY 的控制端写入来将任何击键发送到 TTY。
如果它是xterm
或任何类似的终端仿真器,模拟击键的方式是通过上面描述的窗口来进行。
从列表的其余部分来看,我知道的唯一具有模拟击键功能的程序是screen
。您可以将击键发送到screen
会话中的任何命名窗口,如下所示(实际示例,我经常使用):
screen -X at alsamixer stuff 2
这里screen -X
将连接到一个正在运行的屏幕并调用一个命令。at alsamixer
将导致在名为的窗口中调用其余命令alsamixer
。stuff 2
将模拟按下2。
需要注意的是,上述操作仅在screen
会话当前从某处附加时才有效。我不知道如何让它在分离的 上工作screen
。
通过硬件 TTY
您可以让硬件发送实际的按键。如果是串行线,您可以通过将按键写入线路另一端的计算机串行端口来发送按键。如果是本地控制台,您可以让一块硬件连接起来作为真正的键盘(我相信可以找到可以做到这一点的 USB 设备。)
对于 Linux 来说,存在驱动程序,它可以在本地控制台上模拟按键,就像来自实际硬件一样。