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


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


232
2018-04-28 23:36


origem


Nada realmente. A sessão foi interrompida e a segurança da sessão foi comprometida. Se você não colocar a composição para dormir, você pode definir um tempo de vida útil para o cliente fotografar uma batida viva de manter o servidor, mas se o sistema vai dormir, então não há nada que possa ser feito. - darkdragn
Neste caso eu estou procurando por algo que me permita reiniciar uma conexão ssh quebrada (baseada provavelmente no código de saída) e restaurar usando screen? - sorin
As pessoas estão erradas: tenho DOIS computadores cliente de desktop conectados ao SAME server. Um é o Ubuntu, o Quantum, cujo cliente SSH funciona bem e mantém a conexão por horas. O outro é o Ubuntu 14.10, utópico, além do outro e em uma nova instalação; depois de alguns minutos, bloqueia-se com esta mensagem. O resto das funções de rede na máquina não são interrompidas. Portanto, não, não é um problema de rede, nem um problema de servidor, mas um problema específico de software SSH CLIENT, que PODE ser resolvido, oposto ao que "darkdragan" se atreve a dizer, que "nada pode ser feito". - David L
E de fato, como eu disse: as pessoas falam demais quando dizem "nada pode ser feito", assim como @darkdragn ousou. Eu li a resposta de Aram Kocharyan, e eu a apliquei: 20 minutos atrás ... Eu percebi que no meu velho Quantal Ubuntu 12.10, eu tinha aplicado aquela instrução naquele arquivo [eu acabei de conferir], dois anos atrás, e isso foi a razão da estabilidade lá. Eu fiz isso aqui, e nesses últimos 20 minutos, a conexão ficou estável desde então. Então, por favor, as pessoas: se abstenham quando ousarem pensar que "nada pode ser feito", e se abstenham ainda mais quando tentam deixar essa mensagem para outras pessoas. - David L
@DavidL você deve ler as perguntas melhor antes de reclamar. Seu problema não é o mesmo do OP, que claramente menciona colocar o computador no modo de suspensão. Que por sinal apenas uma das respostas aborda ("mosh"), e foi postado 2 anos após a pergunta. No entanto, as outras respostas fazem a próxima melhor coisa, que é propor soluções para casos que podem ser resolvidos mais facilmente, como o seu. Chill out, não seja tão estressado, reclamando não faz nenhum bem por aqui ... - msb


Respostas:


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

Host *
ServerAliveInterval 120

É com que frequência, em segundos, deve enviar uma mensagem de atividade 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 dentro /etc/ssh/ssh_config da máquina cliente ou ClientAliveInterval dentro /etc/ssh/sshd_config da máquina do servidor. Tente reduzir o intervalo se você ainda estiver recebendo o erro.

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


211
2018-05-26 11:49



Sim eu faço semelhante e funciona muito bem para a maioria das coisas. - Oli♦
Eu não estou em um Mac, mas o Ubuntu 12.04 e o arquivo para este sistema operacional também parece ser ~ / .ssh / config. - H2ONaCl
OS X 10.8.4 apresenta um erro Bad configuration option: ClientAliveInterval - ohho
Eu recebo o mesmo Bad configuration option erro no OSX 10.8.4. - Nick Heiner
Geralmente, você coloca esses dois comandos em partes diferentes do sistema. Apenas ServerAliveInterval no lado do cliente OSX ... e apenas ClientAliveInterval no arquivo de configuração sshd ... - ftrotter


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 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, você verá um novo terminal aberto e poderá usá-lo para executar tarefas. Vamos dizer que sua sessão ssh morre no processo. Corrida screen -d então screen -r reabrirá a última sessão e você poderá continuar de lá. Certifique-se de ler parte da documentação antes de usá-lo.


70
2017-10-04 16:28



Esta é provavelmente a melhor resposta, não sei por que não foi votada mais alto. As outras "correções" são úteis no caso especial em que você realmente se preocuparia em manter uma conexão SSH, mas na maioria dos casos eu imagino que a preocupação real é que os processos pretendidos continuem sendo executados, independentemente de qualquer problema de conexão cliente / servidor. . - Paul McMurdie
Eu também adicionaria Tuxux como uma alternativa para a tela. Eu acho mais versátil e estável que a tela. - fridaymeetssunday
apenas deixando isso aqui para referência futura - você pode executar convenientemente screen -d -r para recuperar sua última sessão. - doplumi
Ou simplesmente screen -dr. Ou screen -x dependendo do que você está planejando fazer. O ponto é, deve-se saber o que todos esses switches fazem, para que se possa usar os apropriados e não apenas seguir cegamente as sugestões das pessoas da internet. Há um bom resumo compacto disponível aqui: ss64.com/bash/screen.html - flith


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 está resolvido. ClientAliveInterval opção só é útil ao configurar o servidor ssh (aka sshd), ele não muda uma coisa no lado do cliente ssh, por isso não usá-lo no arquivo de configuração acima.

Isso 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 restringi-lo apenas a um servidor específico, substituindo a linha Host * com Host <IP> (substitua por um endereço IP, veja 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, definindo ClientAliveInterval para 0 ou ajustar ClientAliveInterval e ClientAliveCountMax para definir uma inatividade máxima do cliente ssh sem responder às sondas. Uma vantagem dessas configurações sobre TCPKeepAlive é que os sinais são enviados pelos canais criptografados, portanto, é menos provável que seja falsificável.


40
2017-10-06 02:54



Não funciona Eu estou enfrentando o mesmo erro novamente. - user997704
Tente direto da linha de comando e vá para baixo: ssh -o ServerAliveInterval = 5 user @ host - Matt
Tentei isso também .. não funciona. Eu realmente não sei o que está acontecendo com o meu sistema - user997704
É ClientAliveCountMax, NOT ClientAliveMaxCount - David G
@DavidG Por favor edite a resposta com suas correções. - CivMeierFan


Estou atualizando remotamente um servidor Ubuntu de lúcida para precisa 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

dentro

/etc/ssh/ssh_config

22
2017-10-07 18:40





Para o cliente, edite seu ~/.ssh/config (ou /etc/ssh/ssh_config) arquivo como segue:

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 chato (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 - Isso 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 - Isso 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   Verifica.).


Veja também: O que fazer as opções ServerAliveInterval e ClientAliveInterval em sshd_config, precisamente?


18
2017-10-02 13:52





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 roamingsuporta intermitente   conectividade, e fornece inteligente local   eco e edição de linha de pressionamentos de tecla do usuário.

Mosh é um substituto do SSH. É mais robusto e responsivo   especialmente através de links Wi-Fi, celular e de longa distância.

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


16
2017-09-30 18:48





Para mim, eu estava ficando 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 uns para os outros para os problemas de rede de seus clientes.

Se você tiver uma conexão dial-up 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 provedores pareceu tornar minha conexão interrompida menos frequente.


4
2017-07-30 13:33





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 o terminal, basta pressionar CTRL + C e continuar trabalhando.


3
2017-09-09 16:50



ou simplesmente sair top corrida - Eben Geer


Você pode adicionar esses argumentos toda vez que invocar o 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 função ou script para tornar isso fácil.

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.


0
2018-02-12 13:05