当我使用ssh -X连接到我的服务器并在服务器上运行例如xterm时,xterm 在我的本地计算机上打开。
我真正想做的是让安装在服务器上的 xterm 在服务器上打开并在服务器物理显示器上呈现。. 换句话说,如果我坐在服务器旁边并在服务器键盘上输入xterm ,效果相同。
如果我跳过-X参数连接到服务器并运行 xterm,我会得到:
/usr/bin/xterm: Xt error: Can't open display:
/usr/bin/xterm: DISPLAY is not set
所以我尝试像这样设置DISPLAY变量:
export DISPLAY=localhost:0.0
但后来我得到:
/usr/bin/xterm: Xt error: Can't open display: localhost:0.0
如何运行xterm命令并使其在服务器物理屏幕上执行?
为了让它工作,你的服务器显然首先必须运行 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 socket的优点是效率更高,访问控制可以基于uid。多年来,在 X 服务器中默认禁用 TCP 并且只接受通过 unix 套接字的连接是一种常见的做法。由于您似乎没有特别需要 TCP 连接,我建议您只需更改命令以使用 unix 套接字而不是 TCP 套接字。
这些命令也可以缩写一点。这个版本应该可以工作:
xterm
虽然这个命令可以工作,但它不会给你与从本地 X 会话开始时完全相同的结果。要获得相同的结果,您需要确保所有环境变量都相同,而不仅仅是DISPLAY
变量。桌面环境往往会设置很多环境变量。我发现实现这一点的最简单方法是
screen
在登录到本地 X 会话后启动命令,然后根据需要远程附加到该命令。所以登录后我打开一个终端并输入
screen -xR somename
. 然后按ctrla与d分离。远程登录后,我可以附加到屏幕screen -xR somename
并运行我需要的命令,例如xterm&
在您的情况下。一旦我完成再次按下ctrla然后d分离。当我偶尔需要重新启动时,这在桌面上非常有用,compiz
因为它已锁定。不过,我还没有在服务器上找到任何用途。如果您没有
screen
提前从本地 X 会话启动命令,并且需要从远程 shell 在本地显示器上启动 X 客户端,则需要首先像在本地 X 会话中一样设置所有环境变量。为此,您可以选择该会话中任何现有 X 客户端的 PID,并找到所有环境变量,如下所示: