如何阻止 ssh(通过 cygwin)因服务器断开连接/超时而挂起

如何阻止 ssh(通过 cygwin)因服务器断开连接/超时而挂起

设想:

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

以下是针对有限情况的解决方案:如果断开连接的函数是可预测的,并且您明确调用了该函数,并且您只想在调用它之后干净地退出,并且如果您知道此命令将花费超过一秒钟的时间导致断开连接,则可以使用nohupsleep并并行调用exit。例如,如果您的命令保证需要一秒钟以上的时间才能导致断开连接,则可以像这样调用它:

nohup <slowcommand> & (sleep 1 && exit)

这保证了:

  • slowcommandexit将在被调用之前开始运行
  • shell 将在slowcommand导致断开连接之前退出(如果slowcommand导致断开连接需要一秒钟以上的时间)
  • slowcommand不会因调用而终止exit

相关内容