Networking

為什麼當 SSH 連接中斷時控制台有時會永遠掛起?

  • October 18, 2021

我已經在許多控制台(在 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.)

引用自:https://serverfault.com/questions/283129