
有沒有辦法連接到已中斷連線的 ssh 會話?我們與正在單獨處理的遠端站點的網路連線存在問題;然而,與此同時,我們在連接到遠端位置的伺服器時,由於資料包遺失而遇到大量斷開連接。很多時候,會話會保持活動狀態一段時間,有時它恰好處於某些操作(文件編輯、運行某些進程等)中間,我需要返回而不是重新啟動(如果可能的話)。
答案1
更新:有關實際答案,請參閱下面的 Zero_r 答案
這不是答案,而是解決方法。使用螢幕。
首次登入時,執行 screen。您獲得另一個 shell,在其中執行命令。如果您斷開連接,螢幕進程會保持終端處於活動狀態,以便您的 shell 及其正在運行的進程不會崩潰。重新連線後,執行“screen -r”即可恢復。
配置和使用螢幕還有很多內容,但上面的內容應該可以解決您的問題。
答案2
嘗試在伺服器端 sshd.conf 上將 ClientAliveInterval (例如 60)和 TCPKeepAlive (是或否)設定為適當的值。
即使連接丟失幾分鐘,這也應該使您的會話保持活動狀態。
答案3
正如剛才所提到的,GNU 螢幕是要走的路。它允許您在遠端盒子上進行“螢幕會話”,您可以透過多個“螢幕視窗”在其中運行多個命令。如果您的父 SSH 連線中斷,這將簡單地分離,從而保持其中運行的所有子程序正常運行。
man screen
screen
和往常一樣是你的朋友,如果預設未安裝,則應呼叫作業系統包。
基礎知識是:
啟動螢幕會話(在遠端主機上):
$ screen
中斷與螢幕會話的連線:CTRL-A,d
再次登入後重新連線到您的螢幕工作階段:
$ screen -d -r
開啟另一個螢幕「視窗」:CTRL-A,c
循環瀏覽開啟的螢幕視窗:CTRL-A,space
有地段您可以用螢幕做很多很酷的事情。我已經使用它十多年了,而且我仍在尋找新功能。這是我最喜歡的 Unix 實用程式。
答案4
有時我也忘記運行螢幕並丟失了未完成的工作。在這種情況下,儘管我們無法重新連接到損壞的 SSH 會話,但由於reptyr
.
意外地從 SSH 會話斷開連接後,首先要做的就是運行screen
(或 tmux,無論你喜歡什麼),以免連接再次中斷。然後在新會話中運行ps aux | grep {The process to be resumed}
以獲取PID。有了 PID,您可以嘗試reptyr {PID}
或reptyr -T {PID}
(如果有子進程)繼續工作。
補充筆記:
另外,請考慮在伺服器端 sshd.conf 上將 ClientAliveInterval(例如 60)和 TCPKeepAlive(是或否)設定為適當的值正如zero_r的回答中所提到的。或者,如果您必須在丟包率極高的網路環境中工作,例如暴風雨中的 Starlink,切換到 MOSH,一種 SSH 替代方案,但基於 UDP。