在启用 X11 转发的 ssh 后打开 X 程序时,如何修复“无法打开显示”错误?

Dar*_*zer 151 ssh display xorg gtk

在我的 Mac(OS X 10.6.8)上启动 X11 应用程序(XQuartz 2.3.6,xorg-server 1.4.2-apple56)后,在 X11 中打开一个终端并运行xhost +,然后ssh -Y我到我的 Ubuntu 10.04 VM(在 VMware 上运行)融合)。当我跑步时gedit .bashrc(例如),我得到:

(gedit:9510): Gtk-WARNING **: cannot open display: 
Run Code Online (Sandbox Code Playgroud)

set | grep DISPLAY 什么都不返回。

但是如果我ssh -Y进入我的 Ubuntu 11.04 机器,就gedit .bashrc可以了。 echo $DISPLAY返回“本地主机:10.0”。

export DISPLAY=localhost:10.0在 sshed 进入我的 VM 然后运行时尝试过gedit .bashrc,但我得到:

(gedit:9625): Gtk-WARNING **: cannot open display: localhost:10.0
Run Code Online (Sandbox Code Playgroud)

两台不同的 Ubuntu 机器的配置有什么不同可以解释为什么一台可以工作而另一台不可以?

更新:正如Zoredache在下面的评论中所建议的,我跑了sudo apt-get install xbase-clients,但我仍然遇到同样的问题。

har*_*ymc 82

来自xhost+:如何在远程服务器上启动 GUI 时修复“无法打开显示”错误

:您可以按照本文中提到的 xhost 程序修复“无法打开显示”错误。

允许客户端使用 xhost+ 从任何主机连接

执行以下命令禁用访问控制,您可以允许客户端从任何主机连接。

$ xhost +
Run Code Online (Sandbox Code Playgroud)

禁用访问控制,客户端可以从任何主机连接

启用 X11 转发

在执行 ssh 时,使用选项 -X 来启用 X11 转发。

$ ssh username@hostname -X
Run Code Online (Sandbox Code Playgroud)

启用受信任的 X11 转发,通过使用 -Y 选项,

$ ssh username@hostname -Y
Run Code Online (Sandbox Code Playgroud)

在该主机中打开 GUI 应用程序

如上所述打开与远程主机的 ssh 连接后,您可以打开任何 GUI 应用程序,它可以毫无问题地打开它。

如果仍然出现“无法打开显示器”错误,请按如下所示设置 DISPLAY 变量。

$ export DISPLAY='IP:0.0'
Run Code Online (Sandbox Code Playgroud)

注意:IP 是您希望在其中显示 GUI 应用程序的本地工作站的 IP。

  • +1 注意**IP = 是您想要获取 GUI 的本地工作站的 IP** (22认同)
  • 对于那些在 OS X 上有类似问题的人,还要确保你安装了 XQuartz,否则这些修复都没有帮助。(OP 的问题表明他有 XQuartz,所以对于那些和我有类似问题的人来说,这更像是一个旁注) (4认同)
  • 请注意,运行 `xhost +` 是非常不安全的,不应使用!正如 Stefan Rogin 所提到的,攻击者随后可以从主机连接到您的 XSession,读取您输入的所有内容,甚至更改您看到的屏幕。 (3认同)
  • 无论出于何种原因,“-Y”都能正常工作,而“-X”却不能。 (3认同)

小智 61

检查服务器的sshd_config(通常/etc/ssh/sshd_config),并确保X11Forwarding选项已启用

X11Forwarding yes
Run Code Online (Sandbox Code Playgroud)

如果未指定 X11Forwarding,则默认no在我可以检查的 Debian 机器上。

  • @DerfK,在我的系统“X11Forwarding yes”中,我是否仍然收到错误消息,**(gedit:8381): Gtk-WARNING **: cannot open display:** 在这种情况下 (58认同)
  • 我在设置另一个 Ubuntu VM 后发现,我需要安装 xbase-clients 并启用 X11Forwarding。更新您的答案以包含两者,我会接受。 (6认同)
  • 在这里不起作用,X11Forwarding 设置为 yes。安装了 xauth。 (4认同)
  • 这不应该是公认的答案 - 该问题明确指出 X11 转发已经启用。完全浪费时间... (2认同)

spi*_*nup 24

我在从 Mac OS X 登录 Ubuntu VM 时也遇到了这个问题——出于某种原因,它似乎不喜欢显示变量中的“localhost”。所以手动设置IP,正如harrymc建议的那样:

export DISPLAY="127.0.0.1:10.0"
Run Code Online (Sandbox Code Playgroud)

那么X11程序应该没问题。似乎没有必要告诉操作系统 localhost 和 127.0.0.1 是等效的,但至少它可以工作。

  • 我的错误现在是`无法打开显示“127.0.0.1:10.0”` (10认同)
  • 答对了!我一直被这个问题困扰了一段时间......我通过SSH连接并且无法启动Gtk程序(普通的X11,如“xeyes”,但是有效)。显示是正确的。实际上,“localhost”的分辨率不是!如果我手动设置 DISPLAY=127.0.0.1:10.0 或 DISPLAY=::1:10.0 它确实有效。编辑 /etc/hosts 似乎没有效果;并且 DNS 配置正确(“dig localhost”正确报告 127.0.0.1 和 ::1)因此,Gtk(gtk?gdk?glib?其他?)中 X11 连接的 DNS 解析似乎是一个错误。 (2认同)

Jor*_*ril 14

我的 CentOS KVM 服务器有这个问题,我错过了“xauth”程序。

  • 这帮助我完成了最小的 Debian 安装,非常感谢! (2认同)

小智 11

如果您在使用arg运行一段时间后遇到此问题-X。或者只是ForwardX11在 /etc/ssh/ssh_config 中,然后运行$ ssh username@hostname -Y,以启用受信任的 X11 转发,不知道确切原因,但我猜测-X某些功能会在一段时间后过期,可能是为了提高安全性。

这是我在网上找到的:

如果您使用 ssh -X remotemachine,远程机器将被视为不受信任的客户端。因此,您的本地客户端向远程计算机发送命令并接收图形输出。如果您的命令违反了某些安全设置,您将收到错误消息。

但是,如果您使用 ssh -Y remotemachine,则远程机器将被视为受信任的客户端。最后一个选项可能会导致安全问题。因为其他图形 (X11) 客户端可以从远程机器嗅探数据(制作屏幕截图、进行键盘记录和其他讨厌的事情),甚至可以更改这些数据。

如果您想了解更多关于这些内容,我建议您阅读 Xsecurity 联机帮助页或 X Security 扩展规范。此外,您可以检查 /etc/ssh/ssh_config 中的 ForwardX11 和 ForwardX11Trusted 选项。

来源:


Col*_*lor 8

刚刚在我的 Mac 上测试过,其他系统可能没问题

  1. 允许客户端使用 xhost+ 从任何主机连接

    $ xhost +

  2. 你应该有一个支持X11显示的环境

    【Mac系统】安装X11 for mac https://www.xquartz.org/

  3. 你应该让你的 ssh-server 转发 x11 显示

    更新/etc/ssh/sshd_config并设置X11Forwarding yes,然后重新启动您的 ssh 服务器

  4. 您应该让您的 ssh 会话转发 x11 显示-X参数

    $ ssh -X 用户@ip

  5. 如何在 PyCharm 中打开 X11 应用程序?
    • 打开一个支持 X11 显示的 ssh 会话(记得保留这个会话)
    • echo $DISPLAY在该 ssh 会话中运行
    • DISPLAY为你的 PyCharm设置环境变量


小智 6

我必须/etc/ssh/sshd_config输入以下内容:

X11UseLocalhost no
Run Code Online (Sandbox Code Playgroud)

而不是将其设置为“是”。奇怪,如果默认为“NO” 用户在 Windows 下使用 putty 和 XMing。我在 Fedora 上直接使用 ssh。有时它会开始给我们

error can't open display localhost
Run Code Online (Sandbox Code Playgroud)

重新启动服务器通常会修复它,但这是愚蠢的。执行上述操作后,重新启动了服务器sshd上的服务,并再次使新连接正常工作。


qwr*_*qwr 6

这个设置对我有用:

本地(Windows 10 上的 64 位 Cygwin)DISPLAY=:0

服务器(亚马逊 EC2 RHEL 7.6)DISPLAY=:10.0

通过单击任务栏中的“X applications menu on :0”并选择“系统工具”>“终端”可以找到这些设置


小智 5

运行 UXTERM 或 XTERM 时只需发出

export $DISPLAY 
Run Code Online (Sandbox Code Playgroud)

变量将在那里。然后只需设置并导出即可。