![如何阻止 ssh(通过 cygwin)因服务器断开连接/超时而挂起](https://linux22.com/image/1394183/%E5%A6%82%E4%BD%95%E9%98%BB%E6%AD%A2%20ssh%EF%BC%88%E9%80%9A%E8%BF%87%20cygwin%EF%BC%89%E5%9B%A0%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%96%AD%E5%BC%80%E8%BF%9E%E6%8E%A5%2F%E8%B6%85%E6%97%B6%E8%80%8C%E6%8C%82%E8%B5%B7.png)
设想:
ssh user@host
# good connection, do some work...
# stop working, the server has some function where it automatically disconnects ...
# I come back to my cygwin window and it is unresponsive to ctrl + c/z and finally after maybe 2-5 minutes it comes back with the following error message:
Write failed: Connection reset by peer
MyLocalUsername@MyLocalComputer ~
$
# Now I can resume my cygwin session and reconnect.
我的问题:我不喜欢 cygwin 的挂起方式。我不想强制关闭它,也不想打开另一个窗口(对我来说,使用 cygwin 的目的是为了继续使用键盘,而不会因为返回窗口而降低工作效率。简而言之,我宁愿使用 ctrl + c 来工作,或者让它根本不挂起。
答案1
这对我来说在 Windows 8 上的 Cygwin64 上有效:
1) 使用 -e“~”启动 SSH 连接,将转义字符设置为波浪号。它应该是默认的转义字符,但直到我使用 -e 选项时才起作用。显然,您也可以EscapeChar ~
在 SSH 配置中设置该指令。
2) 当您的 SSH 会话无响应时,请按Enter、~、.。您可能需要或不需要按两次波浪符号才能真正发送它。我在很多地方都看到这是必要的,但对我来说,按一次就行了。
这个答案基于这个和它的评论:https://superuser.com/a/98565/10167
答案2
您可以向 ssh 命令添加一个选项,尝试以下操作:
ssh -o ServerAliveInterval=30 用户名@主机
这应该可以防止您与主机断开连接。
答案3
以下是针对有限情况的解决方案:如果断开连接的函数是可预测的,并且您明确调用了该函数,并且您只想在调用它之后干净地退出,并且如果您知道此命令将花费超过一秒钟的时间导致断开连接,则可以使用nohup
,sleep
并并行调用exit
。例如,如果您的命令保证需要一秒钟以上的时间才能导致断开连接,则可以像这样调用它:
nohup <slowcommand> & (sleep 1 && exit)
这保证了:
slowcommand
exit
将在被调用之前开始运行- shell 将在
slowcommand
导致断开连接之前退出(如果slowcommand
导致断开连接需要一秒钟以上的时间) slowcommand
不会因调用而终止exit