![命令行方式将击键发送到在不同 X-session 上打开的窗口](https://linux22.com/image/1342716/%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%96%B9%E5%BC%8F%E5%B0%86%E5%87%BB%E9%94%AE%E5%8F%91%E9%80%81%E5%88%B0%E5%9C%A8%E4%B8%8D%E5%90%8C%20X-session%20%E4%B8%8A%E6%89%93%E5%BC%80%E7%9A%84%E7%AA%97%E5%8F%A3.png)
在我的主机上,我打开并登录了一个 Ubuntu 桌面。然后,我还从远程计算机登录到这台机器,使用 X2go 创建一个新的 X-session。我有一个 libreoffice 文件在原始会话中打开。我想保存并关闭此文件 - 但从远程机器!(两个会话都有相同的用户登录;如果需要,我可以使用 sudo)
我尝试使用xdotool search
,但无法找到窗口。有没有办法从第二个会话中完成我想要的操作?我可以使用 查看进程,ps -A
甚至可以使用 查看打开的文件lsof
!我该如何“保存并关闭”?
答案1
假设默认配置,“original”上的 xdpyinfo 将显示“:0.0”,例如
xdpyinfo | grep name
如果“x2go”上的 DISPLAY 环境变量是“:1.0”,那么应该如此。
从“x2go”上的终端尝试查找窗口 ID:
DISPLAY=:0.0 xwininfo -root -tree | grep Writer
有可能设置了访问控制,因此它无法工作,但我认为如果您是同一主机上的同一用户 ID(即访问 ~/.Xauthority),它应该可以工作。如果没有访问权限,请检查“xauth list”输出。
如果有效,则使用您最喜欢的工具来控制它。如果您的工具需要这样,请将“-int”添加到上面的 xwininfo 以十进制打印窗口 ID,xdotool 不需要:
export DISPLAY=:0.0
xdotool windowactivate 0x15a18918
xdotool windowfocus 0x15a18918
xdotool key "ctrl+s"
xdotool key "ctrl+q"
或者你可能更幸运地使用这些而不是“ctrl+s”/“ctrl+q”
xdotool key "meta+f" "s"
xdotool key "meta+f" "c"
xdotool key "meta+f" "x"
您可能需要“alt+”而不是“meta+”,我有非标准的 meta/alt/super 映射。meta 对我来说很管用,使用 Xnest 进行了测试。我假设英语菜单布局和加速器未改变。
您的路径上可能会出现弹出窗口,在这种情况下值得尝试:
xdotool key "Escape"
几次,然后重试保存并关闭。请记住 xdotool 对“键”名称的大小写要求很严格。
您应该能够通过在 x2go 上启动 libreoffice 来尝试所有这些,并且不修改您的 DISPLAY。您应该将命令保存到 shell 脚本文件中,这样焦点更改就不会让您感到困惑。
如果 lsof 有效的话,应该会显示文件不再打开:-)
答案2
看起来有几个可能的要求。显然主机需要位于 xhosts 文件中(它被标记为答案),并且导出适当的 DISPLAY 值。这篇文章应该可以帮助您按照您想要的方式进行操作,允许xdotool 查找远程 x11 窗口。