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

时间:2009-10-18 08:57:00

标签: linux ssh cron x11

如果不是登录控制台的人,如何运行X应用程序并将其显示在该X会话上?假设我是root用户,或者我是登录的用户,因此原则上我有继续执行此操作。但我怎么说服X呢?

这种情况的一些例子:

  • 使用SSH登录并运行显示在远程计算机屏幕上的程序(通过SSH隧道传输 - 完全不同)
  • 通过ImageMagick的import命令获取X会话屏幕截图的cron作业
  • 运行击键记录器以进行审计

这是Launch OpenGL app straight from a windowless Linux Terminal

的更简单版本

2 个答案:

答案 0 :(得分:41)

简短的回答是你必须设置DISPLAY环境变量,然后应用才会运行。

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

在现代Linux系统上,有一个X会话位于:0且X11权限数据文件始终为$HOME/.Xauthority,因此您通常可以设置两个环境变量,例如,在Bash中:

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

答案 1 :(得分:17)

结果是你必须知道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)=/ }'