我在secureCRT ssh客户端上运行了以下命令:
$ DISPLAY=abc.xyz.com:0 ; export DISPLAY
$ /bin/xhost +abc.xyz.com
但它输出此错误:
/bin/xhost: unable to open display "abc.xyz.com"
# cat /etc/system-release
Red Hat Enterprise Linux Server release 7.5 (Maipo)
# whoami
root
如何解决此错误?
假设您有两个主机:
首先,您登录到 hostA 并在其上运行
xhost +hostB
以允许 hostB 访问 hostA 的显示。然后,您登录到 hostB,DISPLAY=hostA:0 ; export DISPLAY
在其上运行,然后启动您的应用程序。另请注意:这些是旧式完全未加密的 X11 连接,在现代 Linux 发行版中通常默认禁用。如果您想使用这些命令,您可能首先必须在 hostA 上执行一些操作,将其 X11 服务器配置为通过 TCP 协议侦听传入连接,而不仅仅是通过本地 UNIX 套接字。
(长期以来,这是通过
-nolisten TCP
在 X 服务器命令行中添加一个选项来完成的,您需要删除此选项才能使用未加密的 X11 连接。现代 Xorg X 服务器可能会颠覆这些选项的含义:您可能需要添加显式-listen TCP
选项以启用非本地未加密 X11 连接。)在 Linux/Unix 系统上,
DISPLAY=:0.0
指的是可以使用 UNIX socket 访问的 X11 显示器/tmp/.X11-unix/X0
,因此它是第一个(通常也是唯一一个)本地 X11 服务器。在 Windows 系统上,这种机制是不存在的。仅当 UNIX 套接字机制在本地系统体系结构上可用并且DISPLAY 变量的主机名部分是空字符串时,才使用它。如果列出了主机名,即使它是“localhost”,也会使用 TCP 连接。
如果使用 TCP 连接,则
DISPLAY=hostname:X.Y
指hostname
在 TCP 端口 (X+6000) 上侦听的 X11 服务器。当您启动基于 Windows 的 X11 服务器时——可能是像 Reflection X 这样的商业服务器,或者像VcXsrv或经典Xming这样的免费服务器,默认情况下,它会在启动后立即开始侦听 TCP 端口 6000。
localhost
现代版本可能默认为仅出于安全考虑而监听;经典的替代方法是监听系统拥有的所有 IP 地址。使用 X11 的现代、安全的方式是基于 SSH 的 X11 转发。当您启动启用了 X11 转发的 SSH 客户端时,它将使用任何可用的机制连接到 SSH 客户端主机上的本地 X11 服务器。它将将此连接传递到您使用 SSH 连接中的安全子通道连接到的任何主机。
然后
sshd
远程主机上的守护进程将开始监听一个空闲的 TCP 端口(通常在 6010+ 范围内),设置一个DISPLAY=localhost:X.0
(其中 X = 选择的端口号 - 6000),并且还配合 SSH 客户端自动设置xauth
cookie为您,如果 SSH 客户端的 X11 服务器需要。就客户端主机上的 X11 服务器而言,传入的 X11 流量来自本地 SSH 客户端进程,因此
xhost
SSH 客户端主机上通常不需要命令。结果:您不需要
DISPLAY
手动设置,也不需要xhost
命令。只需确保您的本地 X11 服务器正在运行,在您的 SSH 客户端中启用 X11 转发,使用 SSH 连接到远程主机并启动任何 X11 GUI 程序。该程序的窗口只会在您的本地显示器上弹出。它只是工作。这对于习惯于建立 X11 连接的经典风格的人来说可能是一种启示。
15 多年前,我向一位脾气暴躁的老数据库管理员展示了这一点,他偶尔需要去服务器机房安装 Oracle,因为防火墙不允许经典的未加密 X11 连接。
他拥抱了我。