我在命令行上使用 BASH,通过 SSH 以 root 身份登录到另一个用户的电脑。
我希望向当前登录运行 X-session 的用户发送一条弹出消息,但结果如下:
root@i5:~$ xmessage now
Invalid MIT-MAGIC-COOKIE-1 keyInvalid MIT-MAGIC-COOKIE-1 keyError: Can't open display: :0
预期结果是远程机器上弹出一条消息,显示“现在”。
我可以通过启动本地 x-session 在本地机器上复制它,然后在终端中输入xmessage now
它就可以工作,但如果在终端中我su-
以 root 身份再次尝试,我会得到与上述相同的错误。
我还希望在需要由 cron 以 root 身份在我的本地机器上运行的脚本中使用它,并且在某些情况下,该脚本会提醒我并要求我选择两个按钮之一来向脚本提供反馈。
答案1
在其他用户的桌面会话上打开弹出窗口存在安全问题,因此不允许这样做。否则很容易被滥用网络钓鱼或其他恶意任务。没有特殊权限(如超级用户访问权限),就无法完成您想要的任务。
即使拥有机器的 root 访问权限,是否应该打开弹出窗口仍是一个问题。您不知道弹出窗口会在什么情况下出现,甚至不知道它是否会出现。通常,窗口管理器负责处理新出现的窗口。它可以将其放置在非活动视口或类似位置,因此即使打开,它也不会变得可见。
不过,有一种在机器上联系用户的标准方法。那就是wall
。此工具仍需要 root 权限(以防止垃圾邮件),但它会写入所有打开的 TTY,从而有效地通知正在运行 X 会话的用户。您可能要考虑使用此工具而不是弹出窗口。
答案2
环境变量$XAUTHORITY
保存用于保存 X11 授权 cookie 的文件路径。~/.Xauthority
如果未设置,则默认为。
因此,作为 root,您可能会发现以下内容足以让您在桌面用户的显示器上打开窗口:
export DISPLAY=:0
export XAUTHORITY=~otheruser/.Xauthority
xmessage "Hello, otheruser."
现在,如果用户没有将他们的 cookie 存储在默认文件中(例如,在 Fedora 的最新版本中会发生这种情况),这将不起作用。在这种情况下,您可以使用以下命令找出要设置的$DISPLAY
值$XAUTHORITY
:
cat /proc/$(echo $(ps -C gnome-shell -o pid=))/environ | xargs --null --max-args=1 | egrep '^(DISPLAY|XAUTHORITY)='
(用用户的窗口管理器的名称或您确定他们会运行的其他进程的名称替换 gnome-shell)。
答案3
在...的帮助下这一页,我现在有了如下的解决方案。
$ su
password:
$ xauth list
peter-aspire-ubuntu/unix:0 MIT-MAGIC-COOKIE-1 1978485c4f8d864503a4e645c77fd802
peter-aspire-ubuntu:0 MIT-MAGIC-COOKIE-1 1978485c4f8d864503a4e645c77fd802
$ DISPLAY=peter-aspire-ubuntu:0
$ export DISPLAY
$ cp /home/peter/.Xauthority /root/.Xauthority
cp: overwrite `/root/.Xauthority'? y
$ xmessage now
结果符合预期,并且适合我的问题中描述的所有场景。
感谢所有参加的人。
答案4
实现此目的的一种方法是允许您的计算机使用该xhost
工具并通过 SHH 进行 X 转发连接到远程计算机的 X 服务器。在远程计算机上,您需要允许您的计算机与其通信。这需要X11Forwarding
在远程计算机上运行的 SSH 守护程序中启用此功能。
在远程计算机上:
xhost <local_ip>
在本地计算机上:
export DISPLAY=<remote_ip>:<display>
ssh -Y <username>@<remote_ip> <x_application>
例如如果你的遥控器位于192.168.1.10
本地网络上:
export DISPLAY=192.168.1.10:0
ssh -Y [email protected] xmessage now &
ssh -Y [email protected] xeyes &