O que a mensagem de canal quebrado significa em uma sessão SSH?

103

Às vezes, minha sessão SSH se desconecta com uma Write failed: Broken pipemensagem. O que isso significa? E como posso manter minha sessão aberta?

Eu sei screen, mas essa não é a resposta que estou procurando. Eu acho que isso é uma sshdopção de configuração.

Peter Stuifzand
fonte

Respostas:

89

É possível que o servidor feche as conexões inativas por muito tempo. Você pode atualizar seu cliente ( ServerAliveInterval) ou seu servidor ( ClientAliveInterval)

 ServerAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the server, ssh(1) will send a message through
         the encrypted channel to request a response from the server.  The
         default is 0, indicating that these messages will not be sent to
         the server.  This option applies to protocol version 2 only.

 ClientAliveInterval
         Sets a timeout interval in seconds after which if no data has
         been received from the client, sshd(8) will send a message
         through the encrypted channel to request a response from the
         client.  The default is 0, indicating that these messages will
         not be sent to the client.  This option applies to protocol
         version 2 only.

Para atualizar seu servidor (e reiniciar o seu sshd)

echo "ClientAliveInterval 60" | sudo tee -a /etc/ssh/sshd_config

Ou do lado do cliente:

echo "ServerAliveInterval 60" >> ~/.ssh/config 
Gert
fonte
NB que às vezes "* AliveInterval" não é suficiente stackoverflow.com/questions/10665267/…
rogerdpack 18/15
1
Não existe ~/.ssh/configno meu Mac, tenho que criá-lo lá ou está em outro lugar?
AGamePlayer
5
@AwQiruiGuo Sim, você deve criar o diretório ( ~/.ssh) primeiro. Entãomkdir -p ~/.ssh; chmod 700 ~/.ssh; touch ~/.ssh/config
Gert
6

Uma solução alternativa seria usar mosh- o shell móvel . Ao contrário do ssh, ele se conecta via UDP e suporta roaming. Você pode iniciar sua sessão em casa, suspender seu laptop, levá-lo ao trabalho / amigos / onde quer que tenha internet, desconectar o laptop e continuar trabalhando como se nada tivesse acontecido. É especialmente útil se você estiver com uma péssima conexão com a Internet: mostra feedback instantâneo se as teclas digitadas não chegarem ao servidor e tentar continuamente restabelecer a conexão.

A instalação e a configuração são simples: agora estão incluídas em todas as distribuições atuais do Linux (mais algumas não-Linux) e coordenam a inicialização e a autenticação da sessão por meio de uma conexão ssh anterior. Portanto, se você é capaz de se conectar via ssh user@servervocê provavelmente será capaz de se conectar ao mosh apenas ligando mosh user@server, se os pacotes mosh estiverem instalados nas duas extremidades.

O principal motivo para falhas de conexão é que você precisa acessar o servidor em uma porta UDP (intervalo padrão: 60000-61000) para que o mosh funcione. Portanto, se o servidor estiver protegido por um firewall, você não terá mais sorte se não puder fazer furos nele mesmo ( implicações de segurança ).

Perseids
fonte
3

Se você deseja ter um período de conexão mais longo, no cliente, adicione:

echo 'ServerAliveInterval 30' | sudo tee -a ~/.ssh/config
echo 'ServerAliveCountMax 1200' | sudo tee -a ~/.ssh/config

ServerAliveCountMaxpor padrão, isso é definido como 3. Portanto, assim ServerAliveIntervalque enviar 3 pacotes pequenos de informações para o servidor, ele será desconectado automaticamente. Configurá-lo para 1200 significa que esse processo terá que ocorrer pelo menos 1200 vezes. Em resumo, você deve estar conectado pelo menos 30 * 1200 segundos (10 horas).

Francisco Costa
fonte
5
Por que usar o sudo para um arquivo que pertence ao usuário atual ou ainda não existe?
Hubert Grzeskowiak
2

Isso geralmente significa que sua conexão de rede (TCP) foi redefinida. Por exemplo, seu provedor de Internet reconectou você ou algo assim.

maxschlepzig
fonte
1

Eu tive o mesmo problema, mas não é o esperado. Se você achar que na mesma rede outro servidor está tentando o mesmo endereço IP, você enfrentará o mesmo problema. Para resolver isso, você precisa verificar se existem outros servidores que usam o mesmo endereço IP. Isso pode ser feito usando o arpcomando

Estou usando o Debian, então aqui está uma amostra dos comandos que eu uso para determinar se outro servidor estava realmente usando o mesmo endereço IP

apt-get install arp-scan
arp-scan -I eth0 -l | grep 192.168.1.42
  192.168.1.42 d4:eb:9a:f2:11:a1 (Unknown)
  192.168.1.42 f4:23:a4:38:b5:76 (Unknown) (DUP: 2)

Você notará dois conjuntos de endereços MAC usando o mesmo endereço IP. Evite conflitos, definindo um para outro endereço IP.

Bill Ang
fonte
0

Outra causa para a "mensagem Broken Pipe" é que outra máquina está tentando usar o mesmo IP do seu host.

Uma maneira simples de testar se outra pessoa está usando esse IP:

  1. Desligue seu host
  2. faça ping no mesmo IP para ver se outra máquina está usando esse IP

Para descobrir quais máquinas estão na sua rede, você pode usar o título da pergunta Unix e Linux: Como descobrir quais outras máquinas estão conectadas à rede local .

Josir
fonte