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

Jas*_*ith 35 linux x11 ssh cron

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

这种情况的一些例子:

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

这是一个直接来自无窗口Linux终端Launch OpenGL应用程序的简单版本

hob*_*bbs 43

简短的回答是你必须设置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'
Run Code Online (Sandbox Code Playgroud)

  • 我疯了,还是实际上没有回答这个问题?在这两个答案中,您只阐明了在SSH服务器上的X-Session中运行程序的先决条件.我错过了如何在远程机器上启动X内部程序(例如:LibreOffice)的实际答案.如果有人能够进一步澄清这一点,我会很高兴的.感谢和问候. (4认同)

Jas*_*ith 17

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

快速而肮脏的方式

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

env DISPLAY=:0 XAUTHORITY=/home/whoever/.Xauthority /path/to/my/X/program
Run Code Online (Sandbox Code Playgroud)

更加可靠的方式

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

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