如果SSH闲置一段时间,如何防止SSH断开连接


48

我有一个ssh连接到一台机器,在没有用户输入30分钟后该机器断开连接。但是,如果我开始这样的话top,连接会保持活跃状态​​。由于这是客户端的机器,我无法重新配置该机器的SSH服务器。所以我正在寻找一种方法来自动检测闲置并启动类似的东西top。有点像Bash的“屏幕保护程序”。

我知道我可以这样做screen,但遗憾的screen是没有安装,我无法安装软件。所以我需要使用Bash提供的功能。

为了说清楚:我正在寻找一个我登录后开始的解决方案,然后我想使用那个终端,走开,两个小时后回来继续工作,没有在走开之前输入任何东西。此外,我不想寻找隧道的东西(因为我推荐伟大的工具sshuttle)

有任何想法吗?


只是快速注意清除屏幕和Keepalive是不一样的:例如,如果ssh客户端或服务器手势断开连接,即使你有KeepAlive,你的ssh会话也会终止,而屏幕shell不会被终止。
— MariusMatutiae 2014年

Answers:


77

为了说清楚:我正在寻找一个我登录后开始的解决方案,然后我想使用那个终端,走开,两个小时后回来继续工作,没有在走开之前输入任何东西。

问题是有一些东西(通常是防火墙或负载均衡器),它会丢弃空闲会话。如果配置会话保持活动,则Keepalive将阻止网络设备将会话视为空闲。

Linux / Unix / Cygwin OpenSSH修复:
最简单的解决方法是启用ssh客户端keepalive; 此示例将每60秒发送一次ssh keepalive:

ssh -o "ServerAliveInterval 60" <SERVER_ADDRESS>

如果您想在所有会话中启用此功能,请将其放入您的/etc/ssh/ssh_config或~/.ssh/config:

ServerAliveInterval 60

有关更多信息,请参见ssh_config联机帮助页

腻子修复:

将其保存到您的PuTTY“默认设置”...

  • 单击“连接”
  • 输入60“Keepalives之间的秒数”

putty_screenshot


21

除了Mike Pennigton的回答,我也想让你知道ServerAliveCountMax。

  • 该ServerAliveInterval会发送一个存活每x秒(默认为0,如果没有设置到别的东西即禁用此功能)。
  • 但这只会做ServerAliveCountMax几次。的缺省值ServerAliveCountMax是3(见手册页ssh_config中)。

示例:如果设置ServerAliveInterval为60并保持ServerAliveCountMax原样,则表示keepalive仅保持连接3 * 60 = 180 seconds = 3分钟。

要将此增加到例如2小时保持连接活动,您可以执行以下操作:

每个命令:

因此你应该考虑设置

ssh -o "ServerAliveInterval 60" -o "ServerAliveCountMax 120" <SERVER_ADDRESS>

持久性:

要使其持久写入/etc/ssh/ssh_config(将应用于系统范围)或~/.ssh/config(将仅应用于用户):

ServerAliveInterval 60
ServerAliveCountMax 120

也可以看看:


1
对不起,这是错的。ServerAliveCountMax指定可以在不接收来自服务器的任何消息的情况下发送的服务器活动消息的数量。如果要ssh在冻结后退出(以便可以重新启动),实际上应该设置ServerAliveCountMax为较低的数字。请参阅联系人手册 OP。
— 在

2

我正在使用Mobaxterm并且也遇到了这个问题。Mobaxterm还提供了一个选项,可以在客户端空闲时保持客户端的活动状态。去吧Settings -> Configuration -> SSH。有标题部分SSH settings,检查选项SSH keepalive。然后问题应该消失。

在此输入图像描述


“SSH keepalive”是否在免费版中工作...即使在检查此选项后我的会话也断开了
— samshers

是的,它有效。您的问题可能有其他原因。
— jdhao
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.