如何保持 SSH 會話不中斷?
哈嘍大家好,我是咸魚
不知道小伙伴們有沒有遇到過下面的情況:
使用終端(XShell、secureCRT 或 MobaXterm 等)登錄 Linux 服務(wù)器之后如果有一段時(shí)間沒有進(jìn)行交互,SSH 會話就會斷開
如果正在執(zhí)行一些非后臺命令,SSH 會話斷開就可能會使得這些命令可能會被中斷,導(dǎo)致任務(wù)無法完成
那如何保持 SSH 會話不中斷呢?我們來看一下
原文鏈接:https://linuxiac.com/how-to-keep-ssh-session-alive/
為什么 SSH 會關(guān)閉連接
簡短的回答是,這一切都?xì)w結(jié)為 TCP 超時(shí)
TCP 超時(shí)時(shí)間是指 TCP 連接或網(wǎng)絡(luò)操作在認(rèn)為進(jìn)程失敗之前等待響應(yīng)的時(shí)間
在 Linux 中,TCP 超時(shí)時(shí)間設(shè)置確定了 TCP 連接或操作在丟包或者連接無響應(yīng)前應(yīng)該等待多長時(shí)間
TCP 超時(shí)機(jī)制確保了網(wǎng)絡(luò)通信的可靠性和效率
在保持 SSH 會話的情況下,有三個(gè)關(guān)鍵的系統(tǒng)參數(shù)我們需要注意:
- tcp_keepalive_time:在空閑 TCP 連接上發(fā)送 TCP keepalive 探針的間隔時(shí)間,即使在沒有實(shí)際數(shù)據(jù)傳輸?shù)那闆r下。TCP keepalive 探針用于檢測遠(yuǎn)程主機(jī)是否仍然存活和響應(yīng)
- tcp_keepalive_probes:TCP keepalive 探針,由 TCP 端發(fā)送的數(shù)據(jù)包,用于檢查空閑連接中遠(yuǎn)端的運(yùn)行狀況和響應(yīng)性。有助于檢測遠(yuǎn)程主機(jī)是否變得不可訪問,或者連接是否由于網(wǎng)絡(luò)問題而丟失
- tcp_keepalive_intvl:控制發(fā)送空閑 TCP 連接的 keepalive 探針的時(shí)間間隔
我們可以通過下面的命令來查看上面三個(gè)參數(shù)的值:
tcp_keepalive_time 為 600 表示保持 TCP 連接時(shí)間為 600s 或 10 分鐘,但是這并不意味著我們的 SSH 會話就真的會保持 10 分鐘
因?yàn)?tcp_keepalive_probes 為 9 和 tcp_keepalive_intvl 為 75 表示系統(tǒng)會每隔 75s 發(fā)送 9 個(gè)探測包(總計(jì) 675 s),之后會話將會被視為失敗然后關(guān)閉
也就是說,在 675s 后,SSH 會話將在不活動時(shí)終止,即沒有在終端中輸入內(nèi)容
如何保持 SSH 會話
保持 SSH 會話是一個(gè)涉及 client 和 server 配置的過程
Linux client 配置
對于 Linux client ,我們在家目錄下修改 ~/.ssh/config 文件(如果沒有就創(chuàng)建)
vim ~/.ssh/config
下面是配置
Host *
ServerAliveInterval 120
ServerAliveCountMax 30
- Host:配置僅對 “Host” 關(guān)鍵字后面列出的主機(jī)生效。由于使用了通配符 (*),因此它們適用于所有主機(jī)
- ServerAliveInterval:設(shè)置超時(shí)間隔(以秒為單位),如果沒有從 server 接收到數(shù)據(jù),SSH 將通過加密通道發(fā)送消息,請求 server 響應(yīng)。默認(rèn)值為 0,表示不會將這些消息發(fā)送到 server
- ServerAliveCountMax:設(shè)置在 SSH 沒有收到任何消息的情況下向 server 發(fā)送keepalive 消息的數(shù)量。如果達(dá)到了該閾值,SSH 將斷開與 server 的連接,終止會話(默認(rèn)值為 3)
表示 client 每 120s 向 server 發(fā)送 keepalive 消息,一共發(fā)送 30 次,也就是 120 * 30 = 3600 s(一個(gè)小時(shí)),在這一個(gè)小時(shí)內(nèi) SSH 會話會一直保持
Windows client 配置
對于 Windows 而言,我們一般使用終端來訪問 server
以 secureCRT 為例
選項(xiàng)——>會話選項(xiàng)
圖片
然后點(diǎn)擊【終端】
圖片
Linux server 配置
上面介紹的是 client 端的配置,我們接下來介紹 server 端的配置
修改 /etc/ssh/sshd_config 文件
vim /etc/ssh/sshd_config
TCPKeepAlive yes
ClientAliveInterval 120
ClientAliveCountMax 30
- TCPKeepAlive:是否應(yīng)該向 client 發(fā)送 TCP keepalive 信息
- ClientAliveInterval:設(shè)置超時(shí)間隔(以秒為單位),如果沒有從 client 接收到數(shù)據(jù),SSH 將通過加密通道發(fā)送消息,請求 client 響應(yīng)。默認(rèn)值為 0,表示不會將這些消息發(fā)送到 client
- ClientAliveCountMax:設(shè)置在 SSH 沒有收到任何消息的情況下向 client 發(fā)送keepalive 消息的數(shù)量。如果達(dá)到了該閾值,SSH 將斷開與 client 的連接,終止會話(默認(rèn)值為 3)
與前面講到的 Linux client 配置一樣,server 將保持 SSH 會話一個(gè)小時(shí)(120 * 30 = 3600s)
配置之后重啟 SSH 服務(wù)
systemctl restart sshd