如何在通过 SSH 登录时在远程服务器上运行图形应用程序?

如何在通过 SSH 登录时在远程服务器上运行图形应用程序?

我尝试gedit从 Windows 上的 SSH 终端运行,连接到运行 Ubuntu 12.04 Server 的 Amazon EC2 实例,但出现了以下错误:

Cannot open display:

我如何解决它?

答案1

因此,您正在从家用电脑进行连接(我们称之为你的机器)到服务器(我们称之为服务器) 通过远程控制? 您想通过您的机器在服务器上启动一个带有图形窗口的程序吗?如果答案正确,那么请继续阅读。

让我们调用程序来启动gedit,但所有过程都相同。根据您想要在哪里看到图形窗口,跳到正确的标题。

机器屏幕上的窗口

如果您想要在远程计算机上查看和使用 gedit 的窗口但在服务器上启动,您将希望您的 shell 会话看起来像这样:

user@remote-machine:~$ ssh -X user@server
Last login: Tue Aug 14 13:47:04 2012 from clientXX
*******************************************************************************
M O T D (Message Of The Day)
*******************************************************************************
user@server:~$ gedit .bash_aliases 

** (gedit:7851): WARNING **: Could not load theme icon gtk-home: Icon 'gtk-home' not present in theme

(gedit:7851): Gtk-WARNING **: Attempting to store changes 

不要介意这些警告,它们很正常 - gedit 窗口会弹出到远程机器的屏幕上,就像在服务器上一样。诀窍是使用“-X”选项,这样ssh -X可以启用 X-tunnelling 并DISPLAY正确设置变量。

这假设您使用的是支持 X11 的 SSH 客户端,并且您的服务器正在运行 X 服务器(一些不需要 GUI 的服务器不会运行 X 服务器)。尤其是在 Windows 上,这可能是一个问题,因为大多数 Windows 终端程序都没有 X。韋萊表示MobaX终端是 Windows 上众多具有 X-Server 的 SSH 客户端之一。

但是对于缺少 X11 的服务器,您必须安装它。

在服务器的屏幕上

您还可以通过调用 gedit 在服务器屏幕上启动一个实例,如下所示:

ssh user@server
DISPLAY=:0.0 gedit

您必须用正确的值代替,才能:0.0在正确的 X 屏幕上获得它(仅当多个屏幕连接到您的服务器或其配置有些特殊时才重要)。

这里最常见的无法工作的情况是如果服务器缺少 X11 服务器,但它没有连接到它的显示器或没有图形用户界面,那么你就不会读到这个:D。

一些理论

0.0我不是这方面的专家,但我认为它的工作方式是,每个物理屏幕,即连接到单台计算机的每个显示器,都会以、1.0、、 的形式获得一个运行编号2.0......

此编号由 X-Window-System 又称 X11 分配。该层提供网络和基本图形界面,Unity、Gnome、KDE ​​等可在此基础上构建。

通过在相关机器上运行,您可以查看给定机器有多少显示器以及正在使用的显示器数量。* 然后,每台配置为使其屏幕可用并运行 X 服务器的计算机都有一个主机名。 您可以通过将变量相应地for x in /tmp/.X11-unix/X*; do echo ":${x##*X}"; done设置为 来从同一网络中的任何机器使用主机屏幕。 如果您提供选项,Ssh 会以合理的方式为您完成此操作。DISPLAYDISPLAY=hostname:0.0-X

*注意:我认为有比这个for循环更好的方法。

如果一切都失败了

使用 shell 文本编辑器。vivimnanoemacs最常见的,至少会安装并运行其中一个。 其中nano是最简单且最不言自明的。

答案2

由于您使用的是 Windows,因此您需要一个在 Windows 上运行本地 X 服务器的 SSH 客户端,以便在您的屏幕上远程运行来自服务器的图形应用程序。

根据我的经验,我推荐免费的MobaX终端内置了此功能。请下载并尝试一下:

在此处输入图片描述

如果你遇到任何错误,那是因为有时最小服务器映像可能未设置为允许X-forwarding 进入其中。在这种情况下,请发表评论,我会帮助您解决问题;我已经使用许多运行 Ubuntu/Debian 的最小 VPS 完成了此操作。

答案3

con-f-use 所说的内容

基本上,您通过 SSH 拥有一个终端,而 Gedit 是一个 GUI 程序。con-f-use 的答案将使其从 Linux GUI 客户端会话中工作。

另一种选择是使用非 GUI 编辑器,如 nano、Vi 或其他编辑器。

答案4

好吧,我遇到了无法在我的 vagrant 实例上使用 X forward 的问题。解决方案非常简单。只需安装包即可xauth。如果仍然不起作用,则解决方案是在相应的/etc/ssh/ssh_config/etc/ssh/sshd_config 中启用 X11Forwarding 和相关设置`这些是 X 转发方面通常需要修复的唯一问题。

此外,修复 ssh 相关问题的最重要方法之一是使用ssh -v详细日志记录,以便您了解正在发生的事情。

相关内容