如何在客户端和服务器上配置SSH以防止Write Failed: broken pipe
错误?如果您使客户端计算机入睡并稍后恢复,则通常会发生这种情况。
screen
?恢复的东西。
如何在客户端和服务器上配置SSH以防止Write Failed: broken pipe
错误?如果您使客户端计算机入睡并稍后恢复,则通常会发生这种情况。
screen
?恢复的东西。
Answers:
我已经在/etc/ssh/ssh_config
Linux和Mac上尝试过此操作:
Host *
ServerAliveInterval 120
这是它应该在几秒钟内向服务器发送一个保持活动消息的频率。如果这不起作用,则在工作时训练猴子每两分钟按一次Enter键。
您既可以设置ServerAliveInterval
在/etc/ssh/ssh_config
客户机或ClientAliveInterval
在/etc/ssh/sshd_config
服务器的机器。如果仍然出现错误,请尝试减少间隔。
可以~/.ssh/config
在服务器和客户端上的文件中设置单个用户的配置。确保文件具有正确的权限chmod 644 ~/.ssh/config
。
Bad configuration option: ClientAliveInterval
Bad configuration option
在OSX 10.8.4上遇到了同样的错误。
SSH会话可能由于多种(可能是不可避免的)原因而中断。
可以用来减轻由此引起的问题的有用工具称为screen
。Screen是一个功能强大的实用程序,可让您控制多个终端,这些终端将独立于ssh会话而保持活动状态。例如,如果您screen
在ssh会话中运行,您将看到一个新的终端打开,您可以使用它来运行作业。假设您的ssh会话在此过程中死亡。运行screen -d
然后screen -r
将重新打开上一个会话,您将可以从那里继续。使用前,请确保您已阅读一些文档。
screen -d -r
以恢复上一个会话。
screen -dr
。或screen -x
取决于您打算做什么。关键是,人们应该知道所有这些开关的作用,以便人们可以使用适当的开关,而不仅仅是盲目地遵循互联网人士的建议。这里有一个不错的紧凑摘要:ss64.com/bash/screen.html
客户端配置
尝试创建文件:
~/.ssh/config
添加内容:
Host *
ServerAliveInterval 30
ServerAliveCountMax 5
现在,将ssh连接到服务器,看看问题是否已解决。ClientAliveInterval选项仅在配置ssh服务器(也称为sshd)时才有用,它不会在ssh客户端上更改任何内容,因此不要在上面的配置文件中使用它。
如果在前30秒内未收到任何数据包(如上所述),这将向服务器发送“您好”的信号。但是,如果连续有“您好”的信号达到ServerAliveCountMax,则ssh将与服务器断开连接。该值默认为3(因此3 * 30 = 90秒,无服务器活动),如果适合您的需要,可以增加该值。.ssh / config文件还有很多配置选项,您可以阅读:
有关其他选项的更多信息。您可能不希望将此示例应用于您将连接到的每个服务器。或者通过更换线就限制到只有特定的服务器Host *
与Host <IP>
(通过IP地址更换,请参阅ssh_config中手册页)。
服务器配置
同样,您可以告诉服务器对您的客户端保持温和。配置文件是/etc/ssh/sshd_config
。
ClientAliveInterval 20
ClientAliveCountMax 5
您可以通过设置ClientAliveInterval
为0
或进行调整来停用它,ClientAliveInterval
并ClientAliveCountMax
设置最大的ssh客户端不活动状态而无需响应探针。与TCPKeepAlive相比,此设置的优点之一是信号通过加密通道发送,因此不太可能被欺骗。
我正在将Ubuntu服务器从lucid远程升级到精确服务器,并在升级过程中丢失了ssh连接,并显示消息“ Write failed。Brocken pipe”。ClientAliveInterval和ServerAliveInterval什么也没做。解决方案是在客户端ssh中打开TCPKeepAlive选项:
TCPKeepAlive yes
在
/etc/ssh/ssh_config
对于客户端,请按照以下步骤编辑您的~/.ssh/config
(或/etc/ssh/ssh_config
)文件:
Host *
TCPKeepAlive yes
ServerAliveInterval 120
TCPKeepAlive-指定系统是否应将TCP Keepalive消息发送到另一侧。如果发送了它们,则将正确地注意到连接中断或其中一台计算机崩溃。但是,这意味着如果路由暂时断开,连接将终止,并且有些人会觉得烦(默认值为“是”)。
ServerAliveInterval-设置超时间隔(以秒为单位),如果没有从服务器接收到任何数据,则ssh(1)将通过加密的通道发送消息以请求服务器的响应。默认值为0,表示这些消息将不会发送到服务器。
对于服务器,将您的/etc/ssh/sshd_config
as 编辑为:
ClientAliveInterval 600
ClientAliveCountMax 0
如果要ssh客户端在10分钟(600秒)后自动退出(超时)。
ClientAliveCountMax –这表示ssh服务器发送的未收到ssh客户端任何响应的校验消息的总数。默认值为3。
ClientAliveInterval –这表示超时(以秒为单位)。x秒后,ssh服务器将向客户端发送一条消息,要求进行响应。默认值为0(服务器将不向客户端发送消息以进行检查。)。
另请参见:选项ServerAliveInterval
和ClientAliveInterval
sshd_config中的功能是什么?
我在这里发布了答案,因为它不是Ubuntu VM。
ssh -o IPQoS=throughput user@host
您可以在每次调用ssh时添加以下参数: -o ServerAliveInterval=15 -o ServerAliveCountMax=3
如果执行此操作,则不必编辑/ etc / ssh / * config文件。
您可以创建一个bash别名或函数或脚本来简化此操作。
例如,这些bash函数可以添加到.bashrc中,do_ssh手动用于打开keepalive。在脚本中使用do_ssh_pty设置pty并避免出现提示。
do_ssh() {
ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}
do_ssh_pty() {
ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}
现在do_ssh user@host
可以使用或do_ssh user@host <args> <command>
和keepalive处于活动状态。