Terminal

如何正確(重新)設置 $DISPLAY?

  • April 27, 2022

我使用 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-因此,如果有人可以在所描述的上下文中解釋它所代表的內容和作用,我將不勝感激。

DISPLAYX 客戶端(應用程序)使用它來查找要連接的相應 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 做這件事似乎並不簡單。是另一個問題,其中提供了一些建議,這些建議可能對您有用(或不適用)。

附加 tmux 後,預設情況下它將DISPLAY在會話環境中更新,但它只能將其應用於新窗格。要將其應用於現有窗格,您應該能夠執行以下操作:

eval "$(tmux showenv -s DISPLAY)"

引用自:https://unix.stackexchange.com/questions/591293