如何将按键远程发送到 X11 应用程序?

cel*_*chk 11 keyboard x11

我有一个 X11 程序(Mathematica/Linux)正在运行,其中包含未保存的数据(在我离开后计算;不幸的是,我没有以编程方式保存数据的远见)。现在我收到一封电子邮件,说电源将被关闭,不幸的是在我回来之前。因此,我想保存数据,只需将Ctrl-发送S到右侧窗口即可(我知道如何找到窗口 ID)。不幸的是,没有安装 xdotool 或 autokey,而且我没有安装其中之一的 root 权限。那么有没有办法做到呢?

当然,一种方法是编写一个 C 程序来完成它(因为功能必须存在,否则那些其他程序就无法工作),但我从未为 X11 编写过任何东西,所以我不认为我'会及时写出来的...

我可以使用 ssh 访问机器,并且可以访问显示(我可以做一个屏幕截图 - 显示锁定屏幕 - 我可以使用 xwininfo 获取窗口列表)。所以我所需要的只是一种将单个Ctrl-发送S到特定窗口的方法,而无需事先安装某些东西。

cel*_*chk 9

我解决了这个问题。

解决方案的第一部分是 Gilles 提供的信息,即 xdotool 只是一个二进制文件,因此无需安装它。只需将可执行文件复制到远程机器(我有权在其上运行存储在我自己目录中的可执行文件)就足够了。

请注意,当我在下面提到任何命令时,我假设DISPLAY变量设置为 Mathematica 运行的显示(在我的情况下是:0.0)。这是我在使用 ssh 登录机器后首先执行的操作,然后再执行以下任何命令。

下一步是认识到当屏幕被锁定时,Gnome 屏幕保护程序会抓取键盘事件,因此发送到 Mathematica 窗口的任何按键操作最终都会出现在屏幕保护程序中。幸运的是 Gnome 屏幕保护程序很容易从命令行解锁。命令是

gnome-screensaver-command -d
Run Code Online (Sandbox Code Playgroud)

我在这里找到的

之后,我使用命令识别了 Mathematica 窗口

xwininfo -root -tree | grep Mathematica
Run Code Online (Sandbox Code Playgroud)

我在这里找到的正确的 Mathematica 窗口很容易识别,因为它在标题中包含笔记本的文件名(“notebook”是特定类型 Mathematica 文档的 Mathematica 名称,您通常用于计算的文档)和一个星号表示它是未保存。每行以相应的窗口 ID(一个十六进制数字,如 0x13371d)开头

确定窗口后,我然后使用它设置焦点

xdotool windowactivate 0x13371d
Run Code Online (Sandbox Code Playgroud)

(其中十六进制数当然是之前获得的窗口 ID)并最终使用 Control-S 将其发送给它

xdotool key ctrl+s
Run Code Online (Sandbox Code Playgroud)

然后我再次使用xwininfo查看窗口标题中的星号确实消失了,说明笔记本确实被保存了。