代码之家  ›  专栏  ›  技术社区  ›  JasonSmith

如何从X会话外部运行X程序(例如从控制台或ssh运行)【关闭】

  •  34
  • JasonSmith  · 技术社区  · 15 年前

    如果不是在控制台登录的人,如何运行X应用程序并在X会话上显示它?假设我要么是根用户,要么是登录的同一个用户,所以原则上我有权限这样做。但我该如何说服X呢?

    一些情况的例子如下:

    • 使用ssh登录并运行显示在远程计算机屏幕上的程序( 完全不同的ssh)
    • 一个cron作业,通过imagemagick的x会话截图 import 命令
    • 为审计目的运行击键记录器

    这是一个更简单的版本 Launch OpenGL app straight from a windowless Linux Terminal

    2 回复  |  直到 14 年前
        1
  •  42
  •   JasonSmith    15 年前

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

    长期的答案是,我们有Xauth,除非您在同一台机器上以相同的用户身份运行,否则可能无法工作,除非您将Xauth凭据从运行X服务器的帐户导出到运行X客户机的帐户。 ssh -X 为您处理这个问题,这就是为什么它很棒,但是手动过程需要运行 xauth extract - $DISPLAY 在X服务器帐户上,并将数据输入 xauth merge - 在客户帐户上。(警告:数据是二进制的。)

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

    export XAUTHORITY=/home/$your_username/.Xauthority
    export DISPLAY=':0'
    
        2
  •  17
  •   JasonSmith    15 年前

    结果是您必须知道X显示(放置在 DISPLAY 环境变量)和magic cookie(放置在文件中,文件名位于 XAUTHORITY 环境变量)。

    快速而肮脏的方式

    在运行x的系统上,如果您是根用户或者您是登录x的同一个用户,只需假设最常见的显示和cookie文件(适用于任何发行版的几乎任何标准桌面安装)。

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

    更可靠的方法

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

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