我运行了下面的命令安全CRTssh客户端:
$ 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
如何解决此错误?
答案1
假设您有两个主机:
- hostA 有您要使用的显示器
- hostB 有您要运行的应用程序
首先,登录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 套接字访问的 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 这样的商业服务器,或者像 Reflection X 这样的免费服务器VcXsrv或经典小明,一启动就会默认开始监听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 连接。
他拥抱了我。