Ssh

emacsclient 連接被拒絕

  • September 3, 2015

我在守護程序模式下執行 emacs,但與執行它的伺服器斷開連接。重新連接後,當我執行

emacsclient -nc

我得到錯誤

連接本地主機埠 6012:連接被拒絕

錯誤:無法打開顯示 localhost:12.0

守護程序似乎仍在執行,但我不知道如何連接到它,有什麼建議嗎?

其他有趣的事實,可能相關也可能不相關:

我通過螢幕會話連接到頭節點,然後連接到伺服器的另一個側節點。

我已經執行此設置幾天了,通常我可以毫無問題地重新連接。

我確定我可以重新啟動守護程序,但我想恢復工作會話,因為它連接到正在執行的 matlab 作業,我通過 matlab-emacs 與之互動。

編輯:我嘗試了 Gilles 的建議,但仍然遇到問題

echo $DISPLAY

返回

本地主機:18.0

我進入螢幕會話並執行

export DISPLAY=localhost:18.0

甚至在螢幕會話中再次執行 echo $DISPLAY

本地主機:18.0

現在 emacsclient -nc 返回

錯誤:顯示本地主機:18.0 無法打開

現在與執行螢幕會話的機器中使用的顯示器相同,但仍然沒有連接。

請注意,我也嘗試過

export display=localhost:18

編輯 2:關於我的系統架構的說明 我辦公室中的筆記型電腦通過 ssh 連接到伺服器“host1”。host1 有許多節點電腦。我首先創建或登錄到螢幕會話

screen -S ohnoplus-five

然後連接到node005

ssh node005

然後我從螢幕上分離而不註銷 node005 並重新附加

螢幕 -r ohnoplus-5

來自主機 1

為了響應 Gills 的建議,我執行了 export DISPLAY=localhost18.0 ,這是 host1 上的 echo $DISPLAY 返回的顯示,而不是我的本地筆記型電腦。

遠端 GUI (X11) 連接通過 TCP 埠 6000+ n其中n是顯示編號¹。所以這兩條消息指的是同一個問題:一些程序試圖連接到顯示器 12 並且失敗了。

Emacsclient 不進行 X11 連接,Emacs 可以。因此,如果您看到此消息,則意味著 Emacsclient 設法聯繫 Emacs 並告訴它打開一個新框架。如果 Emacsclient 認為 X11 顯示可用,則請求 GUI 框架,否則請求終端框架。設置DISPLAY環境變數後,Emacsclient 認為 X11 顯示可用。

DISPLAYSSH 將 X11 連接轉發回本地電腦時,環境變數會自動設置。但是,當您附加到現有的 Screen 會話時,您將獲得在 Screen 會話中設置的環境,包括DISPLAY變數。如果您斷開並重新連接,則無法保證顯示編號相同²。

要更新DISPLAY變數,請從 Screen 會話中分離,執行echo $DISPLAY以查看 SSH 設置的值(例如localhost:13),然後重新附加到 Screen 會話並執行export DISPLAY=localhost:13(或任何正確的數字)。如果 Screen 會話中有多個視窗,則需要在每個視窗中執行此操作。如果您創建新視窗,請鍵入Ctrl+ A :setenv DISPLAY localhost:13``Enter`以在 Screen 本身中設置環境變數,以便創建新視窗。

如果您願意,可以通過取消設置DISPLAY或執行來打開終端框架emacsclient -nw

¹ SSH 使用從 10 開始的顯示編號,僅將數字 0–9 用於本地顯示。在典型情況下,顯示 12 表示這是通過 SSH 打開的第三個 GUI 連接。

²事實上,如果你因為網路問題而斷開連接,但很快又重新連接,很可能遠端機器還沒有註意到網路問題——它只知道客戶端發送任何東西已經有一段時間了,但是這只是正常的不活動——在這種情況下,就遠端機器而言,顯示器 12 仍在使用中。


如果有多個 SSH 躍點,本地機器到中間機器的連接中斷又恢復,那麼在恢復時,中間機器上的顯示數字發生了變化,但中間機器到最終機器的 SSH 連接仍然存在轉發原來的顯示號碼。

在這種情況下,如果您只在最終機器上執行 Screen,並使用中間機器作為代理,那將是最簡單的。添加

Host node[0-9]*
ProxyCommand ssh -W %h:%p host1

到你~/.ssh/config並執行ssh node005。那你就不用擔心中間機了。

如果您必須在中間機器上執行 Screen,那麼您必須在更新DISPLAY變數後重新啟動從 host1 到 node005 的 SSH 連接。(您也可以將 TCP 連接從舊的顯示號碼轉發到新的顯示號碼,但這只有在舊的顯示號碼在此期間沒有被重用時才有效。)

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