Como evitar “Falha na gravação: cano quebrado” na conexão SSH?

222

O que posso fazer para configurar o SSH no cliente e nos servidores para evitar erros Write Failed: broken pipe ? Isso geralmente ocorre se você dorme no computador cliente e retoma mais tarde.

    
por sorin 29.04.2012 / 01:36

9 respostas

204

Eu tentei isso em /etc/ssh/ssh_config para Linux e Mac:

Host *
ServerAliveInterval 120

É com que freqüência, em segundos, ele deve enviar uma mensagem de keep-alive para o servidor. Se isso não funcionar, então treine um macaco para pressionar enter a cada dois minutos enquanto você trabalha.

Você pode definir ServerAliveInterval em /etc/ssh/ssh_config da máquina cliente ou ClientAliveInterval em /etc/ssh/sshd_config da máquina do servidor. Tente reduzir o intervalo se você ainda estiver recebendo o erro.

A configuração para um único usuário pode ser definida no arquivo ~/.ssh/config no servidor e no cliente. Certifique-se de que o arquivo tenha permissões corretas chmod 644 ~/.ssh/config .

    
por Aram Kocharyan 26.05.2012 / 13:49
69

As sessões de SSH podem quebrar devido a numerosas e possivelmente inevitáveis razões.

Um utilitário útil que pode ser usado para mitigar problemas causados por isso é chamado de screen . Screen é um poderoso utilitário que permite controlar vários terminais que permanecerão ativos independentemente da sessão ssh. Por exemplo, se você executar screen em uma sessão ssh, verá um novo terminal aberto e poderá usá-lo para executar tarefas. Vamos dizer que sua sessão ssh morre no processo. A execução de screen -d then screen -r reabrirá a última sessão e você poderá continuar a partir daí. Certifique-se de ler parte da documentação antes de usá-la.

    
por eltommo 04.10.2012 / 18:28
37

Configuração do cliente

Tente criar o arquivo:

~/.ssh/config

Adicione o conteúdo:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Agora ssh para o seu servidor e veja se o seu problema foi corrigido. A opção ClientAliveInterval é útil apenas ao configurar o servidor ssh (também conhecido como sshd), ele não altera nada no lado do cliente ssh, portanto não o use no arquivo de configuração acima.

Isto enviará um sinal de ola-se-você-lá para o servidor se nenhum pacote tiver sido recebido nos 30 segundos anteriores (conforme especificado acima). No entanto, se o número de sinais hello-are-there-there consecutivos chegar a ServerAliveCountMax, o ssh será desconectado do servidor. Este valor é padronizado para 3 (portanto, 3 * 30 = 90 segundos sem atividade do servidor), aumente se for adequado às suas necessidades. Existem muito mais opções de configuração para o arquivo .ssh / config e você pode ler:

Usando um arquivo de configuração SSH

Para mais informações sobre outras opções. Você pode não querer aplicar isso em todos os servidores aos quais você se conecta, conforme o exemplo. Ou restrinja-o apenas a um servidor em particular, substituindo a linha Host * por Host <IP> (substitua por um endereço IP, consulte a página man ssh_config).

Configuração do servidor

Da mesma forma, você pode dizer ao servidor para ser gentil com seus clientes. O arquivo de configuração é /etc/ssh/sshd_config .

ClientAliveInterval 20
ClientAliveCountMax 5

Você pode desativá-lo configurando ClientAliveInterval para 0 ou ajustar ClientAliveInterval e ClientAliveCountMax para definir uma inatividade máxima do cliente ssh sem responder aos probes. Uma vantagem dessas configurações sobre TCPKeepAlive é que os sinais são enviados através dos canais criptografados, portanto, é menos provável que seja falsificável.

    
por Matt 06.10.2013 / 04:54
21

Estou atualizando remotamente um servidor Ubuntu de lúcido para preciso e perdi a conexão ssh no meio da atualização com a mensagem "Write failed. Brocken pipe". ClientAliveInterval e ServerAliveInterval não fizeram nada. A solução é ativar as opções TCPKeepAlive no cliente ssh:

TCPKeepAlive yes

em

/etc/ssh/ssh_config
    
por Alexey Sviridov 07.10.2012 / 20:40
16

Para o cliente, edite seu arquivo ~/.ssh/config (ou /etc/ssh/ssh_config ) da seguinte forma:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120
  

TCPKeepAlive - Especifica se o sistema deve enviar keep-alive TCP   mensagens para o outro lado. Se eles forem enviados, a morte da conexão   ou acidente de uma das máquinas será devidamente notado. Contudo,   isso significa que as conexões vão morrer se a rota cair temporariamente,   e algumas pessoas acham irritante (o padrão é 'sim').

     

ServerAliveInterval - Define um intervalo de tempo limite em segundos após o qual   se nenhum dado tiver sido recebido do servidor, o ssh (1) enviará um   mensagem através do canal criptografado para solicitar uma resposta do   servidor. O padrão é 0, indicando que essas mensagens não serão   enviado para o servidor.

Para o servidor, edite seu /etc/ssh/sshd_config como:

ClientAliveInterval 600
ClientAliveCountMax 0

Se você quiser que o cliente ssh saia (timeout) automaticamente após 10 minutos (600 segundos).

  

ClientAliveCountMax - indica o número total de check-in   mensagem enviada pelo servidor ssh sem obter qualquer resposta do   cliente ssh. O padrão é 3.

     

ClientAliveInterval - indica o tempo limite em segundos. Depois x   número de segundos, o servidor ssh enviará uma mensagem para o cliente pedindo   para resposta. Deafult é 0 (o servidor não enviará mensagem ao cliente para   verifique.).

Veja também: Quais são as opções? ServerAliveInterval e ClientAliveInterval em sshd_config, precisamente?

    
O
por kenorb 02.10.2014 / 15:52
15

Eu absolutamente amo Mosh. Eu freqüentemente ssh em um servidor, fecho meu laptop e vou a um café, abro e continuo como se nada tivesse mudado.

  

Mosh (concha móvel)

     

Aplicativo de terminal remoto que permite roaming , suporta intermitente   conectividade , e fornece locais inteligentes   echo e edição de linha de pressionamentos de teclas de usuário.

     

Mosh é um substituto do SSH. É mais robusto e responsivo   especialmente através de ligações Wi-Fi, celulares e de longa distância.

     

Mosh é um software gratuito, disponível para GNU / Linux, FreeBSD, Solaris, Mac OS X e Android.

    
por Jake 30.09.2014 / 20:48
4

Para mim, eu estava recebendo Write failed: Broken pipe mesmo quando eu estava digitando ativamente no vim ou no prompt do shell. Eu não podia navegar na internet localmente por algum tempo também. (Eu estava conectando remotamente ao Ubuntu usando o Terminal.)

Outros na minha rede transmitem muitos vídeos da Netflix e de outros lugares. Eu não posso provar isso, mas eu suspeito que é um problema de ISP ou roteador. Por exemplo, a Verizon e a Netflix estão apontando dedos uns para os outros para os problemas de rede de seus clientes.

Se você tiver uma conexão discada e estiver transmitindo vídeo ou música com uma conexão SSH ou Telnet simultânea, é inevitável que em algum momento você receba uma mensagem de canal interrompida. Atualizar o pacote de banda larga dos meus ISPs pareceu tornar minha conexão interrompida menos frequente.

    
por Parag Magunia 30.07.2014 / 15:33
3

Eu tenho um script no servidor remoto que nunca parece falhar, independentemente do cliente ou servidor de configuração SSH.

#!/bin/bash
while true; do date; sleep 10; done;

Salve-o em algum arquivo dummy.sh e execute-o rapidamente antes de minimizar a janela ou se afastar dela. Ele continuará imprimindo a hora atual no servidor e manterá sua conexão ativa enquanto a conexão não for interrompida por qualquer outro motivo. Quando você voltar para esse terminal, apenas pressione CTRL + C e continue trabalhando.

    
por JulioHM 09.09.2013 / 18:50
0

Você pode adicionar esses argumentos toda vez que invocar ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Você não precisa editar os arquivos de configuração / etc / ssh / * se fizer isso.

Você pode criar um alias bash ou uma função ou script para facilitar isso.

Por exemplo estas funções bash, você pode adicionar em seu .bashrc, do_ssh é usado manualmente para ativar keepalives. do_ssh_pty é usado dentro de scripts para definir pty e evitar prompts.

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 $*
}

Agora, do_ssh user@host pode ser usado ou do_ssh user@host <args> <command> e keepalives estarão ativos.

    
por gaoithe 12.02.2018 / 14:05

Tags