如何正确(重新)设置 $DISPLAY?

如何正确(重新)设置 $DISPLAY?

我使用 MobaXTerm 通过 ssh 从 Windows PC 连接到 Linux PC。

在 ssh 会话中,我有一个带有一些窗口和窗格的 tmux 会话。

ssh 会话通常会在几个小时不活动后断开连接(我尝试过在 MobaXTerm 中尝试类似相关的保持活动设置,但从未成功)。

第一世界问题:启动新的 ssh 会话后重新附加到我现有的 tmux 会话,该$DISPLAY变量有时会被设置为“不正确” - 我的意思是,当我启动使用 X-Windows(例如 Firefox)的 GUI 时,我会收到“无法打开显示”错误消息。例如:

$ firefox &
[1] 23077
$ Unable to init server: Broadway display type not supported: localhost:11.0
Error: cannot open display: localhost:11.0

[1]+  Exit 1                  firefox
$ echo $DISPLAY
localhost:11.0

通常当我打开一个新的终端,我将获得更新/正确的值$DISPLAY- 从该终端,我将能够成功启动使用 X-Window 的 GUI。

问题:有什么方法可以动态“更新$DISPLAY现存的终端(即在 ssh 断开连接之前一直处于活动状态的终端)?即,我想尝试避免仅仅为了获取/发现 的新值而启动新终端$DISPLAY

我对代表什么并没有真正的理解$DISPLAY- 所以如果有人能够解释它代表什么以及在所描述的上下文中做什么,我将不胜感激。

答案1

附加 tmux 后,默认情况下它将DISPLAY在会话环境中更新,但只能将其应用于新窗格。要将其应用到现有窗格,您应该能够执行以下操作:

eval "$(tmux showenv -s DISPLAY)"

答案2

DISPLAY被X客户端(应用程序)用来寻找对应的X服务器进行连接。它的形式是hostname:displaynr.screennr,但通常你只会看到类似的东西:0,这意味着运行在 上的 X 服务器的第一个显示localhost

在其中使用主机名并不安全,因为 X 协议未加密。因此ssh,X 转发借助此模式,找到一个空闲的显示号码(通常为 10 或更大),并在该显示号码上假装是 X 服务器。但实际上,它只是通过 ssh 连接将 X 协议转发到调用 ssh 客户端的主机上运行的 X 服务器。

这就是为什么DISPLAY当您重新连接时会得到不同的内容ssh- 每个连接都会ssh设置此变量,可能会设置为不同的值。

这个新的正确值是可见的你附加到 tmux。当您打开新终端时它也是可见的,因为新终端将复制新设置的DISPLAY变量,而旧终端将保留DISPLAY其已有的变量。

因此,如果您运行一个自己编写的脚本,而不是附加到 tmux,该脚本会读取DISPLAY、附加到 tmux,然后DISPLAY在现有会话中进行设置,那么您可以自动化您需要执行的操作。

然而,使用 tmux 来做到这一点似乎并不简单。这里是另一个问题,其中有一些建议,如何做到这一点可能适合您(或不适合您)。

答案3

当您登录网络时,请使用-X; (前任。)。ssh -X [email protected]

-X告诉允许ssh显示您的浏览器。

相关内容