我已经看到了这么多的控制台(在Linux,Mac,…),并在许多不同的networking中有许多不同的机器。 我永远无法确定确切的原因,为什么会发生这种情况:您所要做的就是通过SSHlogin到计算机。 如果连接因为某种原因中断(为了简单起见,假设networking电缆已被拉出),那么有时控制台会永远挂起 – 有时候,它只能退出到父shell。
发生这种情况非常烦人(例如,你失去了命令历史logging)。是否有一个可以强制退出的秘密键盘快捷键(Ctrl-C或Ctrl-D不起作用)? 无论如何,这个随机“错误”的原因是什么?
有一个“秘密”键盘快捷键强制退出:〜)从冻结的会话中,按顺序点击这些键: input 〜 。 代字符(仅在换行符后面)被ssh客户端识别为转义序列,并且句点告诉客户终止其业务。
在通信问题上的长期行为不是一个错误,SSH会议挂在希望对方会回来。 如果networking中断,有时甚至几天后,您可以恢复SSH会话。 当然你可以具体说一下,放弃与上面的顺序一起死去。 还有很多事情可以做,比如在你的客户端中设置保持活动超时,这样,如果它没有一段时间的活动链接,它会自行closures,但默认行为是保持为尽可能连接!
编辑:这个中断键的另一个有用的应用是获得本地ssh客户端和背景的注意力,让它回到你的本地shell一分钟 – 从你的历史中获得一些东西,然后让它远程工作。 input 〜Ctrl + Z将ssh客户端发送到本地shell的后台作业队列,然后按正常方式将fg
客户端恢复。
它挂起的事实是TCP的function,而不是SSH。 应用程序无法知道TCP会话/连接已被切断,除非TCP使用连接通知应用程序连接不再存在。 从每个主机的angular度来看,TCP会话仍然处于Established状态,没有什么可以说长时间闲置(没有数据stream动)会话除了RST或对TCP keepalive分组没有响应之外是无效的没有普遍实施)。 这似乎并不是SSH中的一个bug,我期待这种行为。
SSH提供了一个保持活动的设施。 将以下内容添加到本地~/.ssh/config
(如果不存在,则创build):
ServerAliveInterval 15 ServerAliveCount 3
此设置将通过安全隧道每15秒发送一次保持活动信号。 连续三次失败后,SSH客户端将退出。
请注意,在一些系统上,它需要是:
ServerAliveInterval 15 ServerAliveCountMax 3
采取从ask.ubuntu这个答案: https ://askubuntu.com/a/29967/30266
如果连接正确挂起,则在发出按键之前连接已经挂起,所以任何魔法击键都不能通过。 您可以告诉客户端终止,但这不会影响服务器端保存(或不)的历史logging。
虽然这实际上并没有回答这个问题,但它可以帮助减less连接挂起的影响:当我远程工作(甚至通常不是)时,我通过screen
(带或不带byobu
包装,依靠它可用性),以便如果有任何types的连接丢失,我的会话及其所有历史logging将保留并在我重新连接时保留的状态下可用。