可能的重复:
在所有正在运行的 X 显示器上显示通知
作为 root,我试图在远程服务器上执行一个命令,向用户弹出一个消息窗口;问题是,如果没有su - user(因为对于许多用户来说需要太多时间),如何才能获得任何用户的正确DISPLAY值?
答案1
简而言之:没有您想要的解决方案(TM)。
但是,如果对您的设置有足够的了解,就有可能开发出适合您的解决方案。我曾经遇到过同样的问题。
之所以如此困难,是因为 Xserver 完全不与用户绑定。您可以在任何主要的 Linux 发行版上通过登录到您选择的桌面环境、打开终端并输入来确认这一点ps faux
。它将显示您的显示管理器,其中有(至少)两个子进程:一个 xserver 和属于您的用户会话的所有进程的父进程。请注意,xserver 以 root 用户身份启动,并且不是作为您的会话所属的用户。
为了将某个 xserver 与用户名相匹配,我所做的/所做的事情是我进行了多数投票:我查看每个用户进程并检查它连接到哪个 xserver。根据这些知识,我创建了一个列表,该列表告诉我每个用户连接到特定 xserver 的进程数量。该表的示例如下所示:
|xserver :1| xserver :2 | xserver :3 | xserver :4
-------------------------------------------------------------
alice | 17 | 0 | 0 | 0
bob | 0 | 0 | 14 | 0
eve | 0 | 34 | 1 | 0
foo | 1 | 1 | 1 | 8
使用此表,我执行简单多数投票,生成映射:
- 用户 alice 正在使用(即坐在前面)xserver :1
- 用户 bob 正在使用 xserver :3
- 用户 eve 正在使用 xserver :2
- 用户 foo 正在使用 xserver :4
这种多数票不一定会产生正确的映射,但是,对于我的所有意图和目的来说,这已经足够了。
这就是你所需要的。现在你可以
DISPLAY=<ip.to.xserver>:1 xmessage -buttons yes,no,maybe -nearmouse "Do you want to go on a date with me?"
向爱丽丝提出约会。
神奇的是 DISPLAY 环境变量,xapplications 使用它来找出它们应该连接到哪个 xserver。大多数 xapplications 也接受该选项-display
。请参阅xmessage
和的手册页X
。
当然,还有很多其他方法可以代替我的多数票。哪个最适合你,你需要自己去发现...