如何防止 SSH 连接上的“写入失败:管道损坏”?

sor*_*rin 346 ssh

如何在客户端和服务器上配置 SSH 以防止Write Failed: broken pipe错误?如果您使客户端计算机休眠并稍后恢复,则通常会发生这种情况。

Ara*_*yan 329

我已经在/etc/ssh/ssh_configLinux 和 Mac 上尝试过这个:

Host *
ServerAliveInterval 120
Run Code Online (Sandbox Code Playgroud)

这是它应该向服务器发送 keepalive 消息的频率(以秒为单位)。如果这不起作用,那么训练一只猴子在你工作的时候每两分钟按一次回车键。

您既可以设置ServerAliveInterval/etc/ssh/ssh_config客户机或ClientAliveInterval/etc/ssh/sshd_config服务器的机器。如果您仍然收到错误,请尝试减少间隔。

可以~/.ssh/config在服务器端和客户端的文件中设置单个用户的配置。确保文件具有正确的权限chmod 644 ~/.ssh/config

  • 通常,您将这两个命令放入系统的不同部分。只有 OSX 客户端上的 ServerAliveInterval ......并且只有 sshd 配置文件上的 ClientAliveInterval ...... (12认同)
  • OS X 10.8.4 给出错误“错误的配置选项:ClientAliveInterval” (7认同)
  • 我的猴子对我说:“你为什么不自己输入“top [ENTER]” (6认同)
  • 我不在 Mac 上,但 Ubuntu 12.04 和此操作系统的文件似乎也是 ~/.ssh/config。 (4认同)
  • 我在 OSX 10.8.4 上遇到同样的“错误配置选项”错误。 (3认同)
  • 你好,我是猴子,我设法让它发挥作用,不做任何事情就得到了免费的香蕉*实现梦想* (3认同)
  • 请执行“man ssh_config”(客户端)和“man sshd_config”(服务器),您将看到这两个选项在双方均不可用。 (2认同)

elt*_*mmo 104

SSH 会话可能会因众多且可能不可避免的原因而中断。

可用于缓解由此引起的问题的有用实用程序称为screen. Screen 是一个强大的实用程序,它允许您控制多个终端,这些终端将独立于 ssh 会话而保持活动状态。例如,如果您screen在 ssh 会话中运行,您将看到一个新终端打开,您可以使用它来运行作业。假设您的 ssh 会话在此过程中终止。运行screen -d然后screen -r将重新打开最后一个会话,您将能够从那里继续。在使用它之前,请务必阅读一些文档

  • 我还会添加 [Tmux](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-tmux-on-ubuntu-12-10--2) 作为屏幕的替代品. 我发现它比屏幕更通用、更稳定。 (19认同)
  • 这可能是最好的答案,我不确定为什么没有投票更高。其他“修复”在您真正关心维护 SSH 连接的特殊情况下很有帮助,但在大多数用例中,我认为真正关心的是预期的进程会继续运行,而不管任何客户端/服务器连接问题如何. (7认同)
  • 只是留在这里以供将来参考 - 您可以方便地运行`screen -d -r`来恢复您的最后一个会话。 (3认同)
  • 或者干脆`screen -dr`。或者`screen -x` 取决于你打算做什么。关键是,人们应该知道所有这些开关是做什么的,这样才能使用合适的开关,而不是盲目地听从互联网人的建议。这里有一个很好的紧凑摘要:https://ss64.com/bash/screen.html (3认同)
  • 这不是问题的答案 (3认同)

Mat*_*att 58

客户端配置

尝试创建文件:

~/.ssh/config
Run Code Online (Sandbox Code Playgroud)

添加内容:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5
Run Code Online (Sandbox Code Playgroud)

现在 ssh 到您的服务器,看看您的问题是否已解决。ClientAliveInterval 选项只在配置 ssh 服务器(又名 sshd)时有用,它不会改变 ssh 客户端的任何东西,所以不要在上面的配置文件中使用它。

如果在前 30 秒内没有收到任何数据包(如上所述),这将向服务器发送一个 hello-are-you- there 信号。但是,如果连续 hello-are-you- there 信号的数量达到 ServerAliveCountMax,则 ssh 将与服务器断开连接。此值默认为 3(因此 3*30 = 90 秒没有服务器活动),如果它适合您的需要,请增加它。.ssh/config 文件有更多配置选项,您可以阅读:

使用 SSH 配置文件

有关其他选项的更多信息。您可能不希望将此应用到您连接到此示例的每个服务器。或限制它只能通过更换线路的特定服务器Host *Host <IP>(通过IP地址更换,请参阅ssh_config中手册页)。

服务器配置

同样,您可以告诉服务器对您的客户保持温和。配置文件是/etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5
Run Code Online (Sandbox Code Playgroud)

您可以通过设置或者停用ClientAliveInterval,以0或者调整ClientAliveIntervalClientAliveCountMax设置最大SSH客户端闲置不响应探头。与 TCPKeepAlive 相比,此设置的一个优点是信号通过加密通道发送,因此不太可能被欺骗。

  • 直接从命令行尝试并降低:ssh -o ServerAliveInterval=5 user@host (3认同)
  • 它是 ClientAliveCountMax,而不是 ClientAliveMaxCount (2认同)

小智 32

我正在远程将 Ubuntu 服务器从 lucid 升级到精确,并在升级过程中丢失了 ssh 连接,并显示消息“写入失败。管道损坏”。ClientAliveInterval 和 ServerAliveInterval 什么也没做。解决方法是在客户端 ssh 中开启 TCPKeepAlive 选项:

TCPKeepAlive yes
Run Code Online (Sandbox Code Playgroud)

/etc/ssh/ssh_config
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助


ken*_*orb 27

对于客户端,按如下方式编辑您的~/.ssh/config(或/etc/ssh/ssh_config)文件:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120
Run Code Online (Sandbox Code Playgroud)

TCPKeepAlive - 指定系统是否应该向另一端发送 TCP keepalive 消息。如果它们被发送,连接的死亡或其中一台机器的崩溃将被正确地注意到。但是,这意味着如果路由暂时关闭,连接就会中断,有些人会觉得这很烦人(默认为“是”)。

ServerAliveInterval - 以秒为单位设置超时间隔,如果没有从服务器接收到数据,ssh(1) 将通过加密通道发送消息以请求服务器的响应。默认为 0,表示这些消息不会发送到服务器。


对于服务器,编辑您的/etc/ssh/sshd_config为:

ClientAliveInterval 600
ClientAliveCountMax 0
Run Code Online (Sandbox Code Playgroud)

如果您希望 ssh 客户端在 10 分钟(600 秒)后自动退出(超时)。

ClientAliveCountMax – 这表示 ssh 服务器发送的 checkalive 消息的总数,而没有得到 ssh 客户端的任何响应。默认值为 3。

ClientAliveInterval – 这表示以秒为单位的超时。在 x 秒后,ssh 服务器将向客户端发送一条消息,要求响应。默认为 0(服务器不会向客户端发送消息进行检查。)。


另请参阅:sshd_config 中的选项ServerAliveInterval和究竟是做什么的ClientAliveInterval


小智 18

我非常喜欢莫什。我经常 ssh 进入服务器,关闭我的笔记本电脑,然后去咖啡馆,打开它并继续,就好像什么都没有改变一样。

Mosh(移动外壳)

允许漫游的远程终端应用程序,支持间歇性连接,并提供用户按键的智能本地回声和线路编辑。

Mosh 是 SSH 的替代品。它更加强大和响应迅速,尤其是通过 Wi-Fi、蜂窝和长途链接。

Mosh 是免费软件,可用于 GNU/Linux、FreeBSD、Solaris、Mac OS X 和 Android。


Par*_*rag 6

对我来说,Write failed: Broken pipe当我在 vim 中或在 shell 提示符下主动输入时,我得到了。我也有一段时间无法在本地浏览互联网。(我使用终端远程连接到 Ubuntu。)

我网络中的其他人从 Netflix 和其他地方流式传输大量视频。我无法证明,但我怀疑是 ISP 或路由器问题。例如,Verizon 和 Netflix 就客户的网络问题互相指责。

如果您有拨号连接,并且正在通过同步 SSH 或 telnet 连接流式传输视频或音乐,那么在某些时候您将不可避免地收到管道中断消息。升级我的 ISP 宽带套餐似乎使我的断开连接不那么频繁。


小智 6

我在这里发布了我的答案,因为它不是 Ubuntu VM。

https://unix.stackexchange.com/questions/259225/packet-write-wait-broken-pipe-even-leaving-top-running

ssh -o IPQoS=throughput user@host
Run Code Online (Sandbox Code Playgroud)