為什麼當 SSH 連接中斷時控制台有時會永遠掛起?
我已經在許多控制台(在 Linux、Mac 等)以及許多不同網路中的許多不同機器上看到了這一點。我永遠無法確定發生這種情況的確切原因:您所要做的就是通過 SSH 登錄到機器。如果連接由於某種原因中斷(為簡單起見,假設網路電纜被拉斷),那麼有時控制台會永遠掛起 - 在其他時候,它會很好地退出到父 shell。
發生這種情況時會很煩人(例如,您失去了命令歷史記錄。)是否存在可以強制退出的秘密鍵盤快捷鍵(Ctrl-C 或 Ctrl-D 不起作用)?無論如何,所有實現中出現這種隨機“錯誤”的原因是什麼?
Enter``~``.
有一個“秘密”鍵盤快捷鍵可以強制退出客戶立即終止其業務。通信問題上的長時間掛起行為不是錯誤,SSH 會話正在掛起,希望對方能回來。如果網路中斷,有時甚至幾天后您也可以恢復 SSH 會話。當然你可以按照上面的順序具體告訴它放棄和死亡。您還可以執行多種操作,例如在客戶端中設置保持活動超時,以便如果它在一定時間內沒有活動連結,它會自行關閉,但預設行為是保持為盡可能連接!
**編輯:**此中斷鍵的另一個有用的應用是引起本地 ssh 客戶端的注意並將其後台化以返回到本地 shell 一分鐘——比如說從你的歷史記錄中獲取一些東西——然後將其擱置以繼續遠端工作。
Enter``~
Ctrl
+Z
將 ssh 客戶端發送到本地 shell 的後台作業隊列,然後fg
像往常一樣將其取回。**編輯:**在處理嵌套的 SSH 會話時,您可以添加多個波浪字元以僅中斷鍊中的一個 SSH 會話,但保留其他會話。例如,如果您嵌套在 3 個級別中(即您從本地->Machine1->Machine2->Machine3 進行 ssh),
Enter``~``.
將使您回到本地會話,Enter``~``~``.
將您留在 Machine1,並將Enter``~``~``~``.
您留在 Machine2 . 這也適用於其他轉義序列,例如暫時將 ssh 會話移動到後台。通過添加更多波浪號,以上內容適用於任何級別的嵌套。最後,您可以使用
Enter``~``?
列印可用轉義命令的幫助菜單。TL;DR - 支持的轉義命令是支持的轉義序列:
~. - terminate connection (and any multiplexed sessions) ~B - send a BREAK to the remote system ~C - open a command line ~R - request rekey ~V/v - decrease/increase verbosity (LogLevel) ~^Z - suspend ssh ~# - list forwarded connections ~& - background ssh (when waiting for connections to terminate) ~? - this message ~~ - send the escape character by typing it twice (Note that escapes are only recognized immediately after newline.)