我使用 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
显示您的浏览器。