在计算机睡眠时是否可以保持SSH会话处于活动状态?当我让我的Mac(狮子)睡了一小段时间然后唤醒它仍然活着,但如果我一夜之间离开会话连接就会关闭。
我尝试过设置:
ClientAliveInterval 3600 ClientAliveCountMax 10
相同的结果
为什么会话在短时间内“存活”?如何控制此超时?
答案 0 :(得分:16)
我找到的答案取决于tcp keepalive设置:
有关可用TCP设置的列表(FreeBSD 4.8 an up和5.4):
sysctl -A | grep net.inet.tcp
net.inet.tcp.keepidle
- 在发送keepalive探测(如果已启用)之前,(TCP)连接必须处于空闲状态的时间(以毫秒为单位)。
net.inet.tcp.keepintvl
- 发送到远程计算机的keepalive探测之间的间隔(以毫秒为单位)。发送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
文件
答案 1 :(得分:7)
如果您想要一个优雅的解决方案来保持远程会话存活,您应该检查screen
的优点。使用此实用程序时,即使在注销或关闭计算机后,也可以使远程程序保持运行。然后,您可以稍后重新连接可用的screen
会话。
屏幕需要一些时间来学习基础知识,但是当你掌握它的时候,你会看到它有多强大。
您可以查看此链接以获取有关使用屏幕的教程:http://www.thegeekstuff.com/2010/07/screen-command-examples/
答案 2 :(得分:5)
另一种可能的解决方案是mosh,它不完全是SSH,但在计算机进入休眠状态时,甚至在更改IP地址后,都会保持shell连接处于活动状态。
答案 3 :(得分:2)
另一个解决方案是使用autossh,它基本上监视你的ssh会话并在它被中断后立即重新连接(例如,在睡眠周期之后,但是如果你暂时失去WiFi连接) 。这对于转发的端口/ ssh隧道特别有效。
这是一个教程:http://linuxaria.com/howto/permanent-ssh-tunnels-with-autossh。
答案 4 :(得分:1)
有时,会话在没有数据传输时关闭。
保持htop
打开通常会阻止我的ssh连接关闭,并提供有用的实时信息。
Keepalive应该做同样的事情。您可以尝试将间隔(两个Keepalive之间的延迟)减少到60之类,看看它是否会发生任何变化。