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

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

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

答案1

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

Host *
ServerAliveInterval 120

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

ServerAliveInterval您可以在/etc/ssh/ssh_config客户端计算机或服务器计算机ClientAliveInterval中设置/etc/ssh/sshd_config。如果仍然出现错误,请尝试减少间隔。

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

答案2

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

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

答案3

客户端配置

尝试创建文件:

~/.ssh/config

添加内容:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

现在 ssh 到你的服务器,看看你的问题是否已经解决。ClientAliveInterval 选项仅在配置 ssh 服务器(又名 sshd)时有用,它不会改变 ssh 客户端的任何内容,因此不要在上面的配置文件中使用它。

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

使用 SSH 配置文件

有关其他选项的更多信息。您可能不想将此应用于此示例将要连接到的每台服务器。或者,通过Host *Host <IP>(替换为 IP 地址,请参阅 ssh_config 手册页)替换行,将其限制为仅特定服务器。

服务器配置

同样,您可以告诉服务器要温柔地对待您的客户端。配置文件是/etc/ssh/sshd_config

ClientAliveInterval 20
ClientAliveCountMax 5

您可以通过设置ClientAliveInterval0或调整来停用它ClientAliveIntervalClientAliveCountMax以设置不响应探测的最大 ssh 客户端不活动时间。此设置相对于 TCPKeepAlive 的一个优点是信号是通过加密通道发送的,因此不太可能被欺骗。

答案4

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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCP保持连接- 指定系统是否应向另一端发送 TCP 保持活动消息。如果发送了这些消息,则连接中断或其中一台机器崩溃将会被正确注意到。但是,这意味着如果路由暂时中断,连接将会中断,有些人会觉得这很烦人(默认为“是”)。

服务器存活间隔- 设置超时间隔(以秒为单位),如果在此间隔内未从服务器收到任何数据,ssh(1) 将通过加密通道发送一条消息,以请求服务器做出响应。默认值为 0,表示这些消息不会发送到服务器。


对于服务器,编辑如下/etc/ssh/sshd_config

ClientAliveInterval 600
ClientAliveCountMax 0

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

客户端存活数最大值– 这表示 ssh 服务器在未收到 ssh 客户端任何响应的情况下发送的 checkalive 消息总数。默认值为 3。

客户端存活间隔– 表示超时时间(以秒为单位)。经过 x 秒后,ssh 服务器将向客户端发送一条消息,要求其响应。默认值为 0(服务器不会向客户端发送消息进行检查)。


也可以看看:sshd_config 中的选项ServerAliveInterval和具体起什么作用?ClientAliveInterval

相关内容