我正在运行一个 X11 程序(Mathematica/Linux),其中包含未保存的数据(在我离开后计算;不幸的是我没有先见之明以编程方式保存数据)。现在我收到一封电子邮件,通知我电源将被关闭,不幸的是在我回来之前。因此我想保存数据,只需向右侧窗口发送一个Ctrl-即可S(我知道如何找到窗口 ID)。不幸的是,没有安装 xdotool 或 autokey,而且我没有安装其中之一的 root 权限。那么有没有办法做到呢?
当然,一种方法是编写一个 C 程序来完成它(因为功能必须存在,否则其他程序将无法工作),但我从未为 X11 编写过任何内容,所以我认为我不会会及时写出来的...
我可以通过 ssh 访问机器,并且可以访问显示屏(我可以截取屏幕截图 - 显示锁定屏幕 - 我可以使用 xwininfo 获取窗口列表)。所以我需要的是一种将单个Ctrl-发送S到特定窗口而无需事先安装某些东西的方法。
答案1
我解决了这个问题。
解决方案的第一部分是 Gilles 提供的信息,xdotool 只是一个二进制文件,因此无需安装它。只需将可执行文件复制到远程计算机(我有权在该计算机上运行存储在我自己的目录中的可执行文件)就足够了。
请注意,当下面我提到任何命令时,我假设变量DISPLAY
设置为 Mathematica 运行的显示(在我的例子中是:0.0
)。这是我使用 ssh 登录计算机后、在执行以下任何命令之前首先执行的操作。
下一步是认识到当屏幕锁定时,Gnome 屏幕保护程序会捕获键盘事件,因此发送到 Mathematica 窗口的任何按键都会最终到达屏幕保护程序。幸运的是,Gnome 屏幕保护程序很容易从命令行解锁。命令是
gnome-screensaver-command -d
我发现了这里。
之后,我使用命令识别了 Mathematica 窗口
xwininfo -root -tree | grep Mathematica
我发现了这里。正确的 Mathematica 窗口很容易识别,因为它包含在笔记本文件名的标题中(“笔记本”是特定类型的 Mathematica 文档的 Mathematica 名称,通常用于计算的文档)和一个星号以表明它是未保存。每行以相应的窗口 ID 开头(十六进制数字,如 0x13371d)
识别窗口后,我使用
xdotool windowactivate 0x13371d
(其中十六进制数字当然是之前获得的窗口ID)最后使用Control-S发送给它
xdotool key ctrl+s
然后我再次使用xwininfo查看窗口标题中的星星确实消失了,这表明笔记本确实被保存了。