电脑睡眠时保持SSH会话活动?

Ale*_*pov 28 ssh timeout

计算机睡眠时是否可以保持SSH会话存活?当我让我的Mac(狮子)睡了一小段时间,然后唤醒它仍然活着的会话,但如果我一夜之间离开会话连接关闭.

我试过试过:

ClientAliveInterval 3600
ClientAliveCountMax 10

同样的结果

为什么会话在短时间内"存活"?如何控制此超时?

Ale*_*pov 16

我发现答案取决于tcp keepalive设置:

有关可用TCP设置的列表(FreeBSD 4.8 an up和5.4):

sysctl -A | grep net.inet.tcp
Run Code Online (Sandbox Code Playgroud)
  • 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)
Run Code Online (Sandbox Code Playgroud)

结果以毫秒为单位.因此,通过设置

net.inet.tcp.keepidle = 10000 net.inet.tcp.keepintvl = 5000 net.inet.tcp.always_keepalive = 1 (must be 1 always)
Run Code Online (Sandbox Code Playgroud)

当TCP连接断开时,系统将断开呼叫:10000 + (5000 x 8) = 50000msec(50秒).要使系统在启动时记住这些设置,您应该将它们添加到/etc/sysctl.conf文件中

  • 这是应用于服务器端吗? (2认同)

Hak*_*rce 7

如果你想要一个优雅的解决方案来保持远程会话活着,你应该检查screen一下.使用此实用程序时,即使在注销或关闭计算机后,也可以使远程程序保持运行.然后,您可以screen稍后重新连接可用会话.

屏幕需要一些时间来学习基础知识,但是当你掌握它时,你会发现它有多强大.

您可以查看此链接以获取有关使用屏幕的教程:http://www.thegeekstuff.com/2010/07/screen-command-examples/

  • 我更喜欢新的[tmux](https://tmux.github.io/)替代品. (6认同)
  • 确实是一个优雅的解决方案,但没有回答我的问题。感谢您的建议,我会尝试一下。 (2认同)

Jas*_*ens 5

另一个可能的解决方案是mosh,它不是完全SSH,但是当你的计算机进入睡眠状态时,或者甚至在更改IP地址之后,它会使你的shell连接保持活动状态.

  • `mosh`的问题是它需要在防火墙上打开大范围的UDP端口.这对很多人来说都是一个问题. (4认同)