从远程 SSH 连接运行本地 X11 命令

从远程 SSH 连接运行本地 X11 命令

当我使用连接到我的服务器时SSH-X例如运行终端在服务器上,xterm 在我的本地机器上打开。

我真正想做的是让安装在服务器上的 xterm 在服务器上打开并在服务器的物理显示器上呈现。换句话说,如果我坐在服务器旁边输入终端在服务器键盘上。

如果我跳过以下步骤连接到服务器-X参数并运行 xterm,我得到:

/usr/bin/xterm: Xt error: Can't open display: 
/usr/bin/xterm: DISPLAY is not set

所以我尝试设置展示像这样的变量:

export DISPLAY=localhost:0.0

但后来我得到:

/usr/bin/xterm: Xt error: Can't open display: localhost:0.0

我如何运行终端命令并使其在服务器的物理屏幕上执行?

答案1

为了使此功能正常工作,您的服务器显然首先必须运行 X 服务器。Linux 服务器通常没有安装任何 X 服务器,因此您必须首先验证服务器上是否存在 X 服务器。

假设您的服务器实际上正在运行 X 服务器,最可能的解释是您使用错误的协议连接到 X 服务器。

DISPLAY=localhost:0.0和之间是有区别的DISPLAY=:0.0

当您写入时,localhost:0.0这意味着客户端将解析主机名localhost并通过 TCP 连接到 X 服务器。端口号计算为 6000 加上显示号,这里将是 6000 + 0 = 6000。

当您写入时,:0.0这意味着客户端将使用 unix 套接字连接到 X 服务器。unix 套接字的优点是它们更高效,并且可以基于 uid 进行访问控制。

多年来,在 X 服务器中默认禁用 TCP 并仅接受通过 unix 套接字的连接是一种常见做法。由于您似乎对 TCP 连接没有特定需求,我建议您将命令更改为使用 unix 套接字而不是 TCP 套接字。

命令也可以稍微缩写一下。此版本应该可以工作:

DISPLAY=:0 xterm &

xterm虽然此命令可以工作,但它不会给出与从本地 X 会话启动时完全相同的结果。要获得相同的结果,您需要确保所有环境变量都相同,而不仅仅是DISPLAY变量相同。桌面环境往往会设置很多环境变量。

我发现实现此目的的最简单方法是screen登录本地 X 会话后启动一个命令,然后根据需要远程连接到该命令。

因此,登录后,我打开一个终端并输入screen -xR somename。然后按ctrla,然后按 以d从中分离。远程登录后,我可以使用 连接到屏幕screen -xR somename并运行我需要的命令(例如xterm&您的情况)。完成后,再次按,ctrla然后按 以d分离。这在桌面上非常有用,因为我偶尔需要重新启动,compiz因为它已锁定。不过,我还没有发现它在服务器上有任何用处。

如果您事先没有screen从本地 X 会话启动命令,而需要从远程 shell 在本地显示器上启动 X 客户端,则需要先像在本地 X 会话中一样设置所有环境变量。为此,您可以选择该会话中任何现有 X 客户端的 PID,然后查找所有环境变量,如下所示:

tr '\0' '\n' </proc/$PID/environ

相关内容