如何防止SSH会话在OS X终端中挂起?


101

当我在终端中通过活动的SSH会话关闭MacBook,然后将其唤醒时,提示无响应。

五分钟左右说

Write failed: Broken pipe

并终止。

当我在十五分钟内没有在终端中键入任何内容时,也会发生这种情况。

我可以强制OS X执行以下操作:

  1. 保持SSH连接尽可能长时间的活动
  2. 一旦反应迟钝,请立即将杀死

Answers:


121

为了使连接保持活动状态,您可以在显示/etc/ssh/ssh_config的行中进行检查,该行ServerAliveInterval告诉您计算机多长时间(以秒为单位)发送一个空数据包来保持连接状态。如果那里有一个0,表明您的计算机没有在尝试使连接保持活动状态(已禁用),否则它会告诉您发送上述数据包的频率(以秒为单位)。尝试输入120或240,如果它仍然终止连接,则可以降低到5,如果没有达到该数字,则可能是路由器将连接转储到可用内存中。

为了在挂起时杀死它,可以使用ssh转义字符:

~.

也就是说,先按代字号,然后按句号(如果它不起作用),请在按该键之前按Enter键,这将立即终止连接。


3
好的,您可以使用~.取消提示,很棒的提示!但是它实际上是做什么的呢?
CousinCocaine 2014年

我唯一感到困惑的是是否必须重新启动sshd,但似乎只是退出会话并重新连接就可以了
dgig 2014年

常〜。几分钟无法为我工作。这是为什么?
Sridhar Sarnobat

2
的位置ssh_config/etc/ssh/ssh_config在Mac OS X我可以编辑自己的答案,但我没有在这个网站足够的代表这样做。
Erik B

我应该将其放入客户端还是服务器?我认为是客户,但可以更清楚。
EralpB

23

您可以:

在系统范围内为所有连接配置系统,方法是编辑:/ etc / ssh / ssh_config 并添加以下行:

ServerAliveInterval 10

或者,每服务器〜/ .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

它基本上每10秒发送一次保持活动的数据包...


9

您也可以尝试使用很棒的mosh项目。当您再次拥有正常工作的网络时,它将妥善处理网络丢失,机器进入睡眠状态等情况,并愉快地恢复连接。

另一个历史悠久的解决方案是在远程计算机上使用tmux。在那种情况下,您仍然可能会遇到管道破裂的情况,但是如果您重新连接外壳程序,则应用程序将在离开它们时等待。


实际上,这正是我现在正在做的。
2013年

5

关于配置文件的确切路径,此处的各种答案存在冲突。也许不同的unix有所不同?我建议您阅读系统上的手册页!

man ssh(1)中,搜索文本:config。在我的系统上,我可以选择系统范围的配置文件或此用户的配置文件(路径奇怪地不同)。

man ssh_config(5)中,搜索文本:alive。在我的系统上,看起来我需要同时设置ServerAliveIntervalServerAliveCountMax

在macOS 10.12 Sierra上对我有用的是将以下两行放在〜/ .ssh / config中:

ServerAliveInterval 20
ServerAliveCountMax 180

现在,我可以不断开连接地连接到我的Ubuntu 16.04服务器20 * 180秒= 1小时。让我开心!


3

睡眠或WiFi中断后自动重新连接SSH

  1. 从MacPorts或Homebrew 安装autosshbrew install autossh

  2. 打开终端并运行 autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. 断开wifi连接或将Mac置于睡眠状态。

  4. 当您重新连接到wifi时,ssh会话将自动重新连接。


登录后自动ssh

乔恩·斯泰西(Jon Stacey)写了一篇博客文章,介绍您登录时自动激活ssh会话。

  1. 从MacPorts或Homebrew 安装autosshbrew install autossh

  2. 使用bash脚本创建Automator工作流程

Automator Shell脚本

  1. 转到登录项目系统偏好设置

系统偏好设置>登录项

  1. 将您的Automator工作流程添加到登录项

登录项目


1

将这两行添加到/etc/ssh/ssh_config

ServerAliveInterval 60
TCPKeepAlive yes

1

刚解决此问题,请在中添加以下几行$HOME/.ssh/config

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

设置TCPKeepAlive no告诉客户端仅假定连接仍然良好,直到用户请求另行证明为止,这意味着在您的ssh术语在后台闲置时临时断开连接不会终止连接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.