如何从X会话之外运行X程序(例如,从控制台或SSH)

如果不是在控制台login的人,我该如何运行X应用程序并在X会话中显示? 假设我是根,或者我是同一个用户login,所以原则上我有执行这个。 但是我怎么说服这个X?

这样的情况的一些例子:

  • 使用SSHlogin并运行远程计算机屏幕上显示的程序( 不是通过SSH隧道 – 这是完全不同的)
  • 通过ImageMagick的import命令截取X会话的cron作业
  • 运行键盘logging器用于审计目的

这是一个简单版本的Launch OpenGL应用程序直接从一个无窗口的Linuxterminal

简单的答案是你必须设置DISPLAY环境变量,然后应用程序将运行。

长的答案是我们已经有了Xauth,并且除非您将Xauth凭证从运行X服务器的帐户导出到运行X的帐户,否则,除非您在同一台计算机上以相同用户身份运行,否则可能无法运行客户。 ssh -X为你处理这个问题,这就是为什么它很棒,但手动过程包括在客户端帐户上运行X服务器帐户上的xauth extract - $DISPLAY ,并将该数据提供给xauth merge - 。 (警告:数据是二进制的。)

在现代Linux系统上,在0处有一个X会话,X11权限数据文件总是$HOME/.Xauthority所以你可以经常设置两个环境变量,例如在Bash中:

 export XAUTHORITY=/home/$your_username/.Xauthority export DISPLAY=':0' 

结果是你必须知道X显示(放置在DISPLAY环境变量中)和魔法cookie(放在一个文件中,文件名在XAUTHORITY环境变量中)。

快速和肮脏的方式

在运行X的系统上,如果您是root用户,或者您是登录到X的用户,那么只需假设最常见的显示和Cookie文件(适用于任何发行版的几乎任何标准桌面安装)。

 env DISPLAY=:0 XAUTHORITY=/home/whoever/.Xauthority /path/to/my/X/program 

更确定的方式

从已经运行的X程序的环境中找到它们。 同样,如果您是root用户或登录的用户,则会告诉您(如果用户正在使用GNOME):

 cat /proc/`pgrep -f ^x-session-manager`/environ \ | ruby -ne 'puts $_.split("\0").select { |e| e =~ /^(DISPLAY|XAUTHORITY)=/ }'