在我的工作计算机上,我经常通过 SSH 连接到两个不相关的服务器。有时 SSH 会话会锁定(不响应键盘输入)。锁定后,我可以通过第二个打开的终端通过 SSH 进入,这可行但不会解冻冻结的终端。~.在终端断开连接并为我提供本地 CLI 之前,按下需要一些时间。我经常从家里通过 SSH 连接到这两个服务器,没有任何问题,所以我怀疑问题出在我的本地工作计算机上。
其他终端是否出现问题?是的,问题出现在 Konqueror 和 Terminator 上。
问题是否同时出现在两个远程服务器上?不
服务器上运行的任何特定应用程序是否会出现此问题?有和没有 GNU Screen,在 CLI 和 VIM 中。
为了测试,我只开了四个终端:两个Konqueror终端,每个服务器一个;和两个终结者终端,每个服务器一个。大约一个小时后,只有一个(终结者)终端锁定。同一服务器的其他终端没有锁定,其他服务器的终端也没有锁定。当然,我在锁定的终端中尝试了 Ctrl-Q 以查看是否发送了错误的 Ctrl-S,但这并没有解决问题。Screen 未在锁定的终端中运行(既不在运行 SSH 的本机会话中,也不在 SSH 会话本身中)。
更新:一个小时后,在 Terminator 中锁定的服务器终于与“Write failed: Broken pipe”断开连接,我有一个可以工作的本地 CLI,并且 Konsole 中的两台服务器也被锁定了。
链条上的某些东西使空闲连接超时,因为 SSH 在空闲时通常不会发送任何内容。但是,您可以让它在空闲时定期发送消息。在 OpenSSH 3.8 及更高版本中:
$ ssh -oServerAliveInterval=60 myremotebox
Run Code Online (Sandbox Code Playgroud)
如果您要ssh经常手动访问此主机,您可能希望将其放入您的~/.ssh/config文件中:
Host myremotebox
ServerAliveInterval=60
Run Code Online (Sandbox Code Playgroud)
这告诉它在没有发送任何其他内容后每 60 秒发送一个空数据包。我在各种基础设施中发现,这足以保持连接有效。
在 OpenSSH 3.8 之前的版本中,您没有此选项,但有一个弱后备。您可以设置KeepAlive使用TCP keepalives的选项。它的工作方式取决于操作系统,并且经常改变其行为会影响所有应用程序。更糟糕的是,默认情况下,网络堆栈通常默认每 2 小时发送一次 TCP keepalive,因此如果您打算以这种方式使用它,您几乎必须更改默认设置,因为 SSH 连接超时的事情可能具有低得多的空闲阈值2小时以上。
请注意,如果您正在阅读 3.8+ 版本的文档,这与TCPKeepAlive选项相同。当他们在 3.8 中添加“server alive”选项时,他们重命名KeepAlive为TCPKeepAlive以区分两者。
| 归档时间: |
|
| 查看次数: |
2608 次 |
| 最近记录: |