如果你使用SSH连接到远程Linux主机,你会注意到,如果你的SSH会话保持一段时间不活动,然后试图再次使用它,SSH会话就会以这样的错误信息断开。
:client_loop: send disconnect: Broken pipe
在某些系统中,它会显示 "Write failed: Broken pipe"或 "Connection closed by remote host"。
让我们看看是什么原因导致这个错误,以及如何去保持你的SSH连接。
用SSH修复broken pipe错误
你可能已经猜到了,SSH连接因为不活动而被关闭。虽然没有设定值,但通常在5分钟左右。
要避免SSH会话断开,您可以做的是从主机到客户端(ClientAliveInterval)或以一定的时间间隔从客户端到主机(ServerAliveInterval)发送一条“alive message”。
通过这种方式,可以使SSH会话保持活动状态,因为客户机和主机之间存在通信,而主机知道客户机仍然存在。
现在,有两种方法可以做到这一点。要么你从客户端向主机发送活着的消息,要么从主机向客户端发送活着的消息。
如果您通过SSH连接到多个主机,请在您的机器上设置它。
如果你是一个系统管理员,有几个用户抱怨SSH连接频繁断开,你可以在主机上设置。
方法1:客户端SSH配置更改
假设您想通过最多10分钟(600秒)的空闲时间来保持SSH连接的活动状态
通过SSH连接到远程Linux系统时,您可以提及以下ServerAliveInterval值:
ssh -o ServerAliveInterval=600 username@server_ip_address
现在,此功能可以工作,但是每次连接到主机时手动输入此选项很麻烦。为什么不将其永久化?
我希望你是知道SSH配置文件的。在客户端,你可以利用它为特定连接或所有连接设置某些SSH参数。我在这里详细解释了SSH配置文件。
首先,确保你有ssh配置文件。如果没有,请创建它。
touch ~/.ssh/config
给予它正确的文件权限是很重要的,否则你会在通过SSH连接时出现权限被拒绝的错误。
使用chmod命令并为其添加以下文件许可权:
chmod 600 ~/.ssh/config
如果不想看详细介绍,请使用以下命令将有效间隔设置为600秒(10分钟):
echo "ServerAliveInterval 600" >>> ~/.ssh/config
这会将您将使用的所有SSH连接的ServerAliveInterval值设置为10分钟。如果需要,请尝试一下。
如果您想使其更合适,则应如下添加:
Host *
ServerAliveInterval 600
方法2:在主机端SSH配置更改
主机的SSH配置文件通常位于/etc/ssh/sshd_config。
如果打开此文件,您将在此处找到两个感兴趣的参数:
ClientAliveInterval: 这是不活动时间段,在该时间段后,主机将向ssh连接的客户端发送活动消息。
ClientAliveCountMax:这是主机将尝试发送活动消息的次数。
假设您将其设置ClientAliveInterval为200秒,并将ClientAliveCountMax其设置为3。这意味着主机将在200秒后发送活动消息。如果客户端没有任何活动,它将在400秒后再次发送活动消息。客户端没有响应/活动,并且在600秒后发送了另一个活动消息。此后(600秒),SSH连接断开。
您可以/etc/ssh/sshd_config在喜欢的基于终端的文本编辑器(如Vim)中编辑文件。查找ClientAliveInterval和ClientAliveCountMax条目。删除行开头的#键,并为其指定适当的值。
保存并退出文件。
请勿将SSH连接超时设置为几个小时。那会很浪费资源。希望本文可以帮助您解决SSH连接中的pipe错误问题。