如何指定一个显示器?

86

当我通过SSH运行某些程序,比如firefox &时,我会收到一个错误提示

Error: no display specified 

我希望能够打开多个显示器,同时显示每个程序的stdout

初始问题:我怎样指定显示器来获取一个多显示的程序?

Pablo Santa Cruz 给了我以下代码作为解决方案,但我不理解它。

$ export DISPLAY=yourmachine.yourdomain.com:0.0

$ firefox &

在这个命令中,“yourmachine”和“yourdomain.com”是什么?

12个回答

89
X的工作方式与任何网络程序的工作方式相同。您需要一台服务器(在这种情况下是X显示服务器)运行在特定的机器上,还有像Firefox这样的X客户端尝试连接到该服务器以获取其信息显示。
通常(在“家用”机器上),客户端和服务器运行在同一台计算机上,并且只有一个服务器,但X足够强大,不需要这样做。它从一开始就具有了服务器/客户端分离的功能。
这允许您执行诸如登录到距离地球另一端的框(以文本模式),告诉它显示服务器是您当前所在的框,然后,窗口突然开始在本地出现,等这种奇妙的事情。
为了使客户端与用户交互,它需要知道如何找到服务器。有许多方法可以做到这一点。许多客户端允许使用-display 或--display选项指定它:
xeyes -display paxbox1.paxco.com:0.0

如果没有明确指定显示器,许多人会使用 DISPLAY 环境变量。你可以像设置其他变量一样设置这个变量:

DISPLAY=paxbox1.paxco.com:0.0; export DISPLAY # in .profile
export DISPLAY=paxbox1.paxco.com:0.0 # in your shell
DISPLAY=paxbox1.paxco.com:0.0 firefox & # for that command (shell permitting)

DISPLAY变量的第一部分只是显示服务器机器的地址。它遵循与任何其他IP地址相同的规则;它可以是可解析的域名(包括localhost)或特定的IP地址(例如192.168.10.55)。

第二部分是X特定的。它给出了要使用的X“显示”(X服务器)编号和屏幕编号。第一个(显示编号)通常是指包含一个或多个屏幕但具有单个键盘和鼠标(即一个输入流)的设备组。屏幕编号通常给出该组内特定的屏幕。

一个示例是:

+----------------------------------------+
|paxbox1.paxco.com|                      |
+-----------------+                      |
|                                        |
|  +----------+----+  +----------+----+  |
|  |Display :0|    |  |Display :1|    |  |
|  +----------+    |  +----------+    |  |
|  |               |  |               |  |
|  | +-----------+ |  |               |  |
|  | |Screen :0.0| |  |               |  |
|  | +-----------+ |  |               |  |
|  | +-----------+ |  |               |  |
|  | |Screen :0.1| |  |               |  |
|  | +-----------+ |  |               |  |
|  | +-----------+ |  | +-----------+ |  |
|  | |Screen :0.2| |  | |Screen :1.0| |  |
|  | +-----------+ |  | +-----------+ |  |
|  | +-----------+ |  | +-----------+ |  |
|  | |Screen :0.3| |  | |Screen :1.1| |  |
|  | +-----------+ |  | +-----------+ |  |
|  | +-----------+ |  | +-----------+ |  |
|  | | Keyboard  | |  | |  Keyboard | |  |
|  | +-----------+ |  | +-----------+ |  |
|  | +-----------+ |  | +-----------+ |  |
|  | |   Mouse   | |  | |   Mouse   | |  |
|  | +-----------+ |  | +-----------+ |  |
|  +---------------+  +---------------+  |
|                                        |
+----------------------------------------+

这里有一台单独的机器(paxbox1.paxco.com),配备了两个显示服务器。第一个服务器有四个屏幕,第二个服务器有两个屏幕。因此,可能的情况如下:

DISPLAY=paxbox1.paxco.com:0.0
DISPLAY=paxbox1.paxco.com:0.1
DISPLAY=paxbox1.paxco.com:0.2
DISPLAY=paxbox1.paxco.com:0.3
DISPLAY=paxbox1.paxco.com:1.0
DISPLAY=paxbox1.paxco.com:1.1

根据您想要窗口出现的位置和想要使用的输入设备。


1
为什么需要在你的配置文件中加入 DISPLAY=paxbox1.paxco.com:0.0; export DISPLAY?这段代码 DISPLAY=paxbox1.paxco.com:0.0 firefox & 的目的是在 Firefox 中查看多个显示器吗? - Léo Léopold Hertz 준영
如果配置文件是一个简单的顺序命令集,则可以在运行的任何位置使用@begueradj。如果它更加复杂,包含条件语句、分支等等,则需要根据控制流程来确定位置。 - paxdiablo
1
@begueradj,如果你正在运行的机器没有图形界面,那么在拥有图形界面的机器上运行GUI应用程序是很正常的,不过通常不会在远离你想控制的地方的机器上运行。 - paxdiablo
3
我们曾经给那些没有正确保护他们的X显示服务器的同事玩的一个恶作剧是使用他们的IP地址,在他们的屏幕上打开"xeyes"(一双眼睛,会注视着他们的鼠标光标)或者更好的是"xroach"(虫子),它可以在屏幕上创建大量的小强,当你揭开它们时它们会很快地躲到窗口后面 :-) - paxdiablo
2
对于其他人在这里寻找关于“monitor”、“screen”、“display”等术语的澄清,维基百科文章的这一部分是有用的:https://en.wikipedia.org/wiki/X_Window_System#Nomenclature - waldyrious
显示剩余4条评论

28
$ export DISPLAY=yourmachine.yourdomain.com:0.0
$ firefox &

9
补充一点,如果你有第二个显示器等情况,可以将":0.0"改为":0.1"。 - Andy White
5
同样地,如果您有多个X会话正在运行,您可以使用:1.0、:2.0等来在特定会话上启动应用程序。 - James

20

当你通过SSH连接到另一台机器时,你可以在SSH中启用X-Forwarding,以便将X window通过SSH隧道加密转发回你的机器。你可以通过在ssh命令行附加-X或在你的SSH配置文件中设置ForwardX11 yes来启用X转发。

要检查X-Forwarding是否成功设置(服务器可能不允许),只需尝试运行echo $DISPLAY,看输出结果是否类似于localhost:10.0


2
我建议使用这个解决方案,因为它更简单。 - Antonio

17

通过登录到您的服务器

ssh -X root@yourIP

编辑/etc/ssh/sshd_config文件,并在其中添加此行。

X11UseLocalhost no

重启CentOS的sshd (查看你的发行版)

/sbin/service sshd restart

检查您的DISPLAY

echo $DISPLAY

你应该能看到这个

yourIP:10.0

享受

firefox

了解更多信息


3
请问你能解释一下为什么这行代码是 X11UseLocalhost no 吗? - Léo Léopold Hertz 준영
谢谢您提供的解决方案!对我来说完美地运作。Ubuntu 18.04。 - cavalcantelucas
没有使用@LéoLéopoldHertz준영选项,X11可能会重定向到主机或客户端终端。您可以遵循更复杂的指示将X服务器指向客户端,或者使用此设置使其明确无误。 - Craig.C
1
在远程设备上添加X11Forwarding yes也可能起作用,即sshd服务器。带有-X选项的ssh客户端管理设置适当的DISPLAY变量。 - Ale

15

尝试

export DISPLAY=localhost:0.0

9
将 "export DISPLAY=:0.0" 翻译成中文,意为设置显示器为 ":0.0"。 - Seppo Erviälä
3
如果我的本地机器是一个没有 GUI 的服务器,我想在 Ubuntu 桌面版上启动 Firefox,应该怎么做? - user3702267
@user3702267,你是否找到了实现你所问的功能的方法? - ArdentLearner
不适用于我 :/ ... 我收到: 未指定协议 无法初始化服务器:无法连接:连接被拒绝 - jjrr

11
请勿在通过SSH连接时手动设置$ DISPLAY。
如果您通过 SSH -X 连接并且$ DISPLAY保持为空,则通常意味着无法建立加密通道。

很可能是因为您缺少xauthxorg-x11-xauth软件包。请尝试在远程计算机上安装它,使用以下命令:

sudo apt-get install xauth
或者
sudo apt-get install xorg-x11-xauth

在此之后,请结束并重新启动您的SSH连接。不要忘记使用SSH -X,以便将X Window输出转发到您的本地计算机。

现在尝试再次运行echo $DISPLAY,看看$DISPLAY是否已被SSH守护进程自动设置。它应该显示一个带有IP地址和端口的行。


你有没有想过为什么/var/lib/dpkg/lock-frontend不可用? - Sridhar Sarnobat

8

我遇到了类似的问题,也许这个答案可以帮助别人。

Error: no display specified错误的原因是Firefox被启动了,但是远程主机上没有运行X服务器(GUI)。您可以使用X11转发在远程主机上运行Firefox,但在本地主机上显示它。在Mac OS X上,您需要下载XQuartz以使用X11转发。没有它,您就不会有一个设置好的$DISPLAY变量,所以如果您尝试echo $DISPLAY,它将为空白。


6
尝试安装xorg-x11-xauth软件包。

1
它必须安装在远程机器或本地机器上吗? - user3702267
3
它必须安装在你连接的那台机器上,而不是你想看到 X11-Gui 的那台机器上。 - kiltek

6

今天我遇到了类似的问题。这里提供一个简单的解决方法:在使用SSH连接到机器时,只需添加Ctrl-Y

ssh user@ip_address -Y

登录后,输入firefox &,然后就可以开始了。

1
“-Y”的目的是什么?为什么要与“Y”一起使用<kbd>CTRL</kbd>键? - Léo Léopold Hertz 준영
这里是否需要像 https://dev59.com/yXRA5IYBdhLWcg3w6SRH#47014623 中描述的那样使用 ssh -X - Léo Léopold Hertz 준영
在我的经验中,-Y或-X都可以工作。但是当我ssh到本地登录的机器时,出现了问题。我认为这是因为X服务器客户端不明确导致的“错误:未指定显示”。 - Craig.C

1

我也在CentOS 6.8中遇到了同样的问题。

yum reinstall xorg*

结束当前会话并在类似mobiXterm的工具中打开另一个会话。确保会话在工具中启用了X11转发。


请您添加安装完成后需要执行的命令。欢迎提供示例! - Léo Léopold Hertz 준영

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接