该xdotool
命令允许我们非常轻松地创建控制系统图形用户界面的脚本。例如,我可以通过执行以下命令在以下桌面中打开我的 Chrome 浏览器xdotool mousemove 26 146 click 1
。
因此,假设我为我的系统创建了一个新用户:
# adduser newuser
如果我登录newuser
不同的会话并执行xdotool
命令,它们就可以正常工作。但是,假设我在不同的 tty 中打开了两个不同的 GUI 会话,其中一个与我的普通用户和其他与新用户,并且我们还可以说我是当前正在运行与我的 GUI 会话普通用户我创建以下脚本:
#!/bin/bash
xdotool mousemove 31 61 click 1
然后我将其保存macro.bash
在我的主文件夹中并执行chmod 777 ~/macro.bash
以为其设置正确的权限。最后,我打开一个新终端并登录为newuser
(当我当前使用常规用户会话时):
$ su newuser
现在,如果我尝试执行我的脚本,我会收到以下错误(请参阅编辑):
newuser@myPC:~$ /home/myregularuser/macro.bash
No protocol specified
Error: Can't open display: (null)
Failed creating new xdo instance
如果我尝试在运行以 newuser 身份记录的 GUI 会话时执行该脚本,则该脚本可以正常工作,但是我的目标是拥有一个宏工具,可以在我使用常规用户会话时通过脚本控制新用户会话的图形界面。是否可以?有谁知道解决此错误的解决方法?
编辑
作为不切实际的在评论中说道电信公司在他的回答中说我缺少设置环境变量$DISPLAY
和的正确值$XAUTHORITY
。虽然我没有按照 telcoM 的答案中所述解决我的问题,但我设法通过以下过程解决它:
1- 登录我的newuser
会话。
2- 插入以下命令作为文件的最后几行~/.bashrc
:
if xhost >& /dev/null; then
echo "export DISPLAY=\"$DISPLAY\"" > $HOME/.variableMemory
echo "export XAUTHORITY=\"$XAUTHORITY\"" >> $HOME/.variableMemory
fi
3-更改我的脚本,使其在执行脚本时将$DISPLAY
和变量重新定义为其正确的值:$XAUTHORITY
#!/bin/bash
source $HOME/.variableMemory
xdotool mousemove 31 61 click 1
有了这个,当我第一次使用图形界面登录 newuser 会话时,我基本上捕获并保存$DISPLAY
和变量的值,以便稍后使用 shell 登录时可以使用这些值。$AUTHORITY
现在我没有看到任何错误,xdotool
当我执行脚本时,我可以使用命令在另一个会话中完美地移动鼠标,但我有一个新问题:位于不同 GUI 会话中的 Xorg 在未使用时被冻结。总而言之,它将我发送给它的所有点击排队,然后当我手动切换到特定的 GUI 会话时立即释放所有点击(这会导致xdotool
无法使用)...所以,问题仍然存在:当我运行不同的 GUI 会话时,是否可以使用宏工具控制 GUI 会话?是否有一个 Xorg 配置可以禁用这种“冻结行为”,以便即使我没有使用该会话,它也可以实时接收单击命令?
附加信息
- 我运行的是 Ubuntu 18.04。
- 使用的显示服务器是Xorg(使用Wayland xdotool根本不起作用,但这个问题与Wayland无关)。
- GNOME 是我目前使用的图形用户界面。
- 我的主要目标是使用宏工具来控制我没有实际使用的屏幕,这样我就可以在宏完成工作时使用计算机。虽然我选择了 xdotool、Ubuntu、Xorg 和 GNOME 来解决这个问题,但我愿意接受使用不同工具、桌面环境甚至不同 Linux 发行版解决相同问题的答案...谢谢!
答案1
您缺少的另一个组件是.Xauthority
文件。它包含一个“会话cookie”,每次X11服务器重新启动时都会重新生成,并且客户端需要拥有它才能向X11服务器发送任何命令。该文件通常位于 中~/.Xauthority
,但您可以使用$XAUTHORITY
环境变量来指定备用位置。
为了控制不属于您的 GUI 会话,您需要获得对该其他会话的会话 cookie 的访问权限。如果它具有不同的值,您可以简单地使用和命令$DISPLAY
将该会话 cookie 复制到您的.Xauthority
文件中:xauth extract
xauth merge
su newuser -c "xauth extract /home/newuser/.Xauthority $newuserDISPLAY" | xauth merge
.Xauthority 文件可以同时保存不同 DISPLAY 的多个会话 cookie。
或者,如果会话 cookie 位于您已经可以访问的文件中,您可以使用该$XAUTHORITY
变量来指向它。
这开始看起来像是一个XY问题:你有一些想要实现的目标,并且可能已经固定xdotool
为假定的实现方式。
但是,当您尝试自动化某些操作时,使用 GUI 进行操作xdotool
通常是最不方便的方法。例如,如果您想以特定用户的身份自动启动 Google Chrome,则无需模拟单击图标:您只需安排正确的身份和环境,然后启动您想要的进程即可。
例如,要google-chrome
以 user 身份启动newuser
,您可以执行以下操作:
su -lc "DISPLAY=<whatever> google-chrome" newuser
由于该su
命令具有-l
选项,因此该google-chrome
进程将具有 newuser 的权限$HOME
,因此它将.Xauthority
在默认位置(即~newuser/.Xauthority
.您只需为$DISPLAY
与实际运行的 GUI 会话相匹配的变量提供正确的值newuser
。如果您希望 Google Chrome 打开特定 URL,您可以将其指定为google-chrome
双引号内的参数。