SSH 锁定:怀疑本地问题,而不是远程问题

SSH 锁定:怀疑本地问题,而不是远程问题

在我的工作计算机上,我定期通过 SSH 连接到两个不相关的服务器。有时 SSH 会话会锁定(不响应键盘输入)。当锁定时,我可以通过第二个打开的终端进行 SSH 连接,该终端可以工作,但不会解冻冻结的终端。~.在终端断开连接并给我一个本地 CLI 之前,按下 键需要一些时间。我经常从家里通过 SSH 连接到这两台服务器,没有出现任何问题,因此我怀疑问题出在我的本地工作计算机上。

其他终端是否也出现此问题?是的,Konqueror 和 Terminator 都会出现此问题。

两个远程服务器是否同时出现该问题?不

服务器上运行的任何特定应用程序是否会出现此问题?有或没有 GNU Screen,无论是在 CLI 上还是在 VIM 中。

为了进行测试,我只打开了四个终端:两个 Konqueror 终端,每个服务器一个;以及两个终结者终端,每个服务器一个。大约一个小时后,只有一个(终结者)终端被锁定。同一服务器的另一个终端没有锁定,另一个服务器的终端也没有锁定。当然,我在锁定的终端中尝试使用 Ctrl-Q 来查看是否发送了错误的 Ctrl-S,但这并没有解决问题。 Screen 未在锁定的终端中运行(无论是在运行 SSH 的本机会话中,还是 SSH 会话本身)。

更新:一小时后,Terminator 中锁定的服务器终于因“写入失败:管道损坏”而断开连接,并且我有一个可以正常工作的本地 CLI,并且 Konsole 中的两台服务器也被锁定。

答案1

整个链中的某些因素导致空闲连接超时,因为 SSH 在空闲时通常不会发送任何内容。但是,您可以让它在空闲时定期发送消息。在 OpenSSH 3.8 及更高版本中:

$ ssh -oServerAliveInterval=60 myremotebox

如果您要ssh经常手动访问该主机,您可能需要将其放入您的~/.ssh/config文件中:

Host myremotebox
    ServerAliveInterval=60

这告诉它在没有发送任何其他数据后每 60 秒发送一个空数据包。我发现在各种基础设施中,这足以保持连接活跃。

在 OpenSSH 3.8 之前的版本中,您没有此选项,但有一个较弱的回退功能。您可以设置该KeepAlive选项,该选项使用TCP 保活。其工作方式取决于操作系统,并且经常更改其行为会影响所有应用程序。更糟糕的是,网络堆栈通常默认每 2 小时发送一次 TCP keepalive,因此您几乎如果您要以这种方式使用它,请更改默认值,因为 SSH 连接超时的原因可能是其空闲阈值远低于 2 小时。

请注意,如果您正在阅读 3.8+ 版本的文档,这与该TCPKeepAlive选项是相同的。当他们在 3.8 中添加“服务器处于活动状态”选项时,他们将其重命名KeepAliveTCPKeepAlive以区分两者。

相关内容