我已经在许多控制台(在Linux,Mac上,...)以及许多不同网络中的许多不同机器上看到了这一点。我永远无法查明发生这种情况的确切原因:您要做的就是通过SSH登录到计算机。如果连接由于某种原因而中断(为简单起见,假设网络电缆被拔出),则有时控制台会永远挂起-在其他时候,它对父shell的出口也很好。
发生这种情况时非常烦人(例如,您丢失了命令历史记录。)也许存在秘密的键盘快捷键可以强制退出(Ctrl-C或Ctrl-D无效)?而且,在所有实现中产生此随机“错误”的原因是什么?
我已经在许多控制台(在Linux,Mac上,...)以及许多不同网络中的许多不同机器上看到了这一点。我永远无法查明发生这种情况的确切原因:您要做的就是通过SSH登录到计算机。如果连接由于某种原因而中断(为简单起见,假设网络电缆被拔出),则有时控制台会永远挂起-在其他时候,它对父shell的出口也很好。
发生这种情况时非常烦人(例如,您丢失了命令历史记录。)也许存在秘密的键盘快捷键可以强制退出(Ctrl-C或Ctrl-D无效)?而且,在所有实现中产生此随机“错误”的原因是什么?
Answers:
有一个“秘密”键盘快捷键可以强制退出:〜)在冻结的会话中,按以下顺序敲击这些键:Enter~.代字号(仅在换行符之后)被ssh客户端识别为转义序列,并且句点告诉客户终止交易无需再费力。
在通信问题上长期存在的行为不是错误,SSH会话正在进行中,希望另一端能够回来。如果网络中断,有时甚至几天后,您就可以恢复SSH会话。当然,您可以明确地告诉它放弃并死于上述顺序。您还可以执行多种操作,例如在客户端中设置保持活动超时,这样,如果客户端在一定时间内没有活动链接,它将自行关闭,但默认行为是保持为尽可能连接!
编辑:此中断密钥的另一个有用的应用是引起本地ssh客户端的注意,并使其后台运行一分钟回到本地shell(例如,从您的历史记录中获取一些信息),然后将其搁置以继续远程工作。Enter~ Ctrl+ Z将ssh客户端发送到本地shell的后台作业队列,然后fg
像往常一样将其取回。
编辑:处理嵌套的SSH会话时,可以添加多个波浪号字符以仅中断链中的SSH会话之一,而保留其他会话。例如,如果您嵌套在3个级别中(例如,从local-> Machine1-> Machine2-> Machine3使用ssh),Enter~.将使您回到本地会话,Enter~~.将您留在Machine1中,并将Enter~~~.您留在Machine2中。这也适用于其他转义序列,例如将ssh会话临时移至后台。上面的方法适用于任何级别的嵌套,只需添加更多代字号即可。
最后,您可以使用Enter~?来打印可用转义命令的帮助菜单。
TL; DR-受支持的转义命令是受支持的转义序列:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - request rekey
~V/v - decrease/increase verbosity (LogLevel)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
~/.somethingorother
Enter 键后输入错误)?
man ssh
在本ESCAPE CHARACTERS
节下涵盖此内容。~.
(断开连接)和~^Z
(背景ssh)非常方便。
如果连接正确挂起,则任何魔术按键都不会通过,因为在您发出按键之前连接已经挂起。您可以告诉客户端终止,但这不会影响在服务器端保留(或不保留)的历史记录。
虽然这实际上不能回答问题,但它可能有助于减少连接挂起的影响:当我在远程工作时(甚至通常在我不在时),我会进行遍历screen
(byobu
根据其可用性使用或不使用包装器)这样,如果有任何连接中断,我的会话及其所有历史记录都将保留并以我重新连接时离开它的状态可用。
exit
/ 正确存在该shell为止,logout
这将解决历史记录问题而无需使用screen
。