2012-05-19 104 views
20

計算機睡眠時可以保持SSH會話還活着嗎?當我把我的Mac(Lion)短時間睡眠,然後將它喚醒時仍然活着,但是如果我在一夜之間離開它,會話連接就會關閉。在計算機休眠時保持SSH會話活着?

我試過集:

 
ClientAliveInterval 3600 
ClientAliveCountMax 10 

相同的結果

爲什麼會 「存活」 的時間短的時間?我怎樣才能控制這個超時?

回答

13

我發現它依賴於TCP保持活動設置了答案:

有關可用的TCP設置列表(FreeBSD的4.8向上和5.4 ):

sysctl -A | grep net.inet.tcp 
  • net.inet.tcp.keepidle - 的時間量,以毫秒爲單位的(TCP)連接必須保持活動PR前空閒obes(如果啓用)被髮送。

  • net.inet.tcp.keepintvl - 發送到遠程機器的保活探測之​​間的時間間隔(以毫秒爲單位)。 TCPTV_KEEPCNT(默認8)探測器發送後,沒有響應,(TCP)連接被丟棄。

  • net.inet.tcp.always_keepalive - 假設在所有TCP連接上都設置了SO_KEEPALIVE,內核會週期性地向遠程主機發送一個數據包,以驗證連接是否仍在運行。

因此公式計算最大TCP連接不活動時間是以下:

net.inet.tcp.keepidle + (net.inet.tcp.keepintvl x 8) 

結果是在毫秒。因此,通過設置

net.inet.tcp.keepidle = 10000 net.inet.tcp.keepintvl = 5000 net.inet.tcp.always_keepalive = 1 (must be 1 always) 

系統時TCP連接是死用於將斷開呼叫:10000 + (5000 x 8) = 50000毫秒(50秒)。爲了讓系統記住在啓動這些設定,你應該將它們添加到/etc/sysctl.conf文件

+2

這是應用在服務器端嗎? – netvope

+0

我還沒有嘗試過,但我想是的,服務器端: [TCP保持連接(http://jampad.net/Library/tcpipprot/ch17.html): 如果用戶是建立連接,做一些工作,然後在一天結束時關閉計算機,而不註銷,則會留下半開連接。如果客戶端消失,在服務器端留下半開連接,並且服務器正在等待來自客戶端的一些數據,則服務器將永遠等待。 Keepalive功能旨在檢測服務器端的這些半開連接。 –

+0

是否有可能爲我的睡眠系統提供一個代理服務器,它可以繼續向服務器發送數據包?通過這種方式,即使在睡眠之後,會話也可以保持活躍。 – sudeepdino008

1

有時,會話在沒有數據傳輸時關閉。 離開htop打開通常會阻止我的ssh連接關閉,並提供有用的實時信息。

Keepalive應該做同樣的事情。你也許可以嘗試將間隔(兩個keepalive之間的延遲)縮短到60,看看它是否會改變任何東西。

+0

如果計算機未處於睡眠狀態SSH會話正常,但我想在睡眠後醒來後重新使用同一會話。它適用於短暫的睡眠時間,但不會很長時間。 –

+1

您可能無法在休眠期間保持ssh會話打開 - 如果計算機正在睡眠,Keepalive將不會被髮送。屏幕是要走的路:http://www.gnu.org/software/screen/ – Gyscos

6

如果你想要一個優雅的解決方案來保持遠程會話活着,你應該檢查screen的利用率。使用此實用程序時,即使在註銷或關閉計算機後,仍可使遠程程序繼續運行。然後,您可以稍後重新連接可用的screen會話。

屏幕需要一些時間來學習基本知識,但是當你掌握它的時候,你會看到它有多強大。

您可以檢查使用屏幕此鏈接教程:http://www.thegeekstuff.com/2010/07/screen-command-examples/

+0

確實是一個優雅的解決方案,但不回答我的問題。感謝您的建議,我會試一試。 –

+5

我更喜歡更新的[tmux](https://tmux.github.io/)替代方案。 –

+0

http://bphogan.com/2012/06/15/tmux/ –

5

另一種可能的解決方案是mosh,這是不完全的SSH但並保持你的外殼連接活着的時候,您的計算機進入睡眠狀態,或改變甚至後IP地址。

+3

mosh問題在於它需要在防火牆上打開大量的UDP端口。這對很多人來說都是一個問題。 – e40

+0

從技術上講,有可能通過ssh會話'sshuttle'UDP流量,然後啓動'mosh' – danbst