2012-05-19 107 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