O que posso fazer para configurar o SSH no cliente e nos servidores para evitar Write Failed: broken pipe
erros? Geralmente ocorre se você dorme o computador cliente e retoma mais tarde.
screen
?
O que posso fazer para configurar o SSH no cliente e nos servidores para evitar Write Failed: broken pipe
erros? Geralmente ocorre se você dorme o computador cliente e retoma mais tarde.
screen
?
Respostas:
Eu tentei isso no /etc/ssh/ssh_config
Linux e Mac:
Host *
ServerAliveInterval 120
É com que frequência, em segundos, ele deve enviar uma mensagem de manutenção permanente para o servidor. Se isso não funcionar, treine um macaco para pressionar enter a cada dois minutos enquanto você trabalha.
Você pode definir ServerAliveInterval
na /etc/ssh/ssh_config
máquina cliente ou ClientAliveInterval
na /etc/ssh/sshd_config
máquina servidor. Tente reduzir o intervalo se você ainda estiver recebendo o erro.
A configuração para um único usuário pode ser definida em arquivo ~/.ssh/config
no servidor e no cliente. Verifique se o arquivo tem permissões corretas chmod 644 ~/.ssh/config
.
Bad configuration option: ClientAliveInterval
Bad configuration option
erro no OSX 10.8.4.
As sessões SSH podem ser interrompidas 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 utilitário poderoso que permite controlar vários terminais que permanecerão ativos independentemente da sessão ssh. Por exemplo, se você executar screen
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 screen -d
então 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.
screen -d -r
para recuperar sua última sessão.
screen -dr
. Ou screen -x
dependendo do que você planeja fazer. O ponto é que é preciso saber o que todos esses comutadores fazem, para poder usar os adequados e não apenas seguir cegamente as sugestões das pessoas da Internet. Há um belo resumo compacto disponível aqui: ss64.com/bash/screen.html
Configuração do cliente
Tente criar o arquivo:
~/.ssh/config
Adicione o conteúdo:
Host *
ServerAliveInterval 30
ServerAliveCountMax 5
Agora faça o ssh no seu servidor e verifique se o seu problema foi corrigido. A opção ClientAliveInterval é útil apenas ao configurar o servidor ssh (também conhecido como sshd), pois não altera nada no lado do cliente ssh, portanto, não use-o no arquivo de configuração acima.
Isso enviará um sinal de olá, você está aí para o servidor se nenhum pacote tiver sido recebido nos 30 segundos anteriores (conforme especificado acima). No entanto, se o número de sinais consecutivos do tipo "olá-você-você-aí" atingirem ServerAliveCountMax, o ssh será desconectado do servidor. Esse valor é padronizado como 3 (portanto, 3 * 30 = 90 segundos sem atividade do servidor), aumente-o se for adequado às suas necessidades. Há muito mais opções de configuração no 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 a todos os servidores aos quais você se conectar ao qual este exemplo será. Ou restrinja-o a apenas um servidor específico substituindo a linha Host *
por Host <IP>
(substitua por um endereço IP, consulte a página de manual 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 através da criação ClientAliveInterval
de 0
ou ajustar ClientAliveInterval
e ClientAliveCountMax
definir uma inatividade máximo cliente ssh sem responder às sondas. Uma vantagem dessas configurações sobre o TCPKeepAlive é que os sinais são enviados pelos canais criptografados, portanto, é menos provável que sejam falsificados.
Estou atualizando remotamente um servidor Ubuntu do lucid para preciso e perdi a conexão ssh no meio da atualização com a mensagem "Falha na gravação. Brocken pipe". ClientAliveInterval e ServerAliveInterval não fizeram nada. A solução é ativar as opções TCPKeepAlive no cliente ssh:
TCPKeepAlive yes
no
/etc/ssh/ssh_config
Para o cliente, edite seu arquivo ~/.ssh/config
(ou /etc/ssh/ssh_config
) da seguinte maneira:
Host *
TCPKeepAlive yes
ServerAliveInterval 120
TCPKeepAlive - Especifica se o sistema deve enviar mensagens de manutenção de TCP para o outro lado. Se forem enviados, a morte da conexão ou falha de uma das máquinas será notada corretamente. No entanto, isso significa que as conexões morrerão se a rota cair temporariamente e algumas pessoas consideram isso irritante (o padrão é 'yes').
ServerAliveInterval - Define um intervalo de tempo limite em segundos, após o qual, se nenhum dado foi recebido do servidor, o ssh (1) enviará uma mensagem através do canal criptografado para solicitar uma resposta do servidor. O padrão é 0, indicando que essas mensagens não serão enviadas ao servidor.
Para o servidor, edite seu /etc/ssh/sshd_config
como:
ClientAliveInterval 600
ClientAliveCountMax 0
Se você deseja que o cliente ssh saia (tempo limite) automaticamente após 10 minutos (600 segundos).
ClientAliveCountMax - Indica o número total de mensagens de verificação enviadas pelo servidor ssh sem obter resposta do cliente ssh. O padrão é 3.
ClientAliveInterval - indica o tempo limite em segundos. Após um número x de segundos, o servidor ssh enviará uma mensagem ao cliente solicitando resposta. O surdo é 0 (o servidor não enviará a mensagem ao cliente para verificar.).
Veja também: O que as opções ServerAliveInterval
e ClientAliveInterval
no sshd_config fazem, precisamente?
Eu absolutamente amo Mosh. Frequentemente, ssh em um servidor, fecho meu laptop e vou a um café, abro e continuo como se nada tivesse mudado.
Mosh (shell móvel)
Aplicativo de terminal remoto que permite roaming , suporta conectividade intermitente e fornece eco local inteligente e edição de linha das teclas do usuário.
Mosh é um substituto para o SSH. É mais robusto e ágil, especialmente através de links Wi-Fi, celular e de longa distância.
Mosh é um software gratuito, disponível para GNU / Linux, FreeBSD, Solaris, Mac OS X e Android.
Para mim, eu estava ficando Write failed: Broken pipe
empolgado quando estava digitando ativamente no vim ou no prompt do shell. Também não consegui navegar na internet localmente por um tempo. (Eu estava me conectando remotamente ao Ubuntu usando o Terminal.)
Outros na minha rede transmitem muitos vídeos do Netflix e de outros lugares. Não posso provar isso, mas suspeito que seja um problema com o provedor ou o roteador. Por exemplo, Verizon e Netflix estão apontando os dedos para os problemas de rede de seus clientes.
Se você possui uma conexão discada e está 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 incorreta. Atualizar o meu pacote de banda larga de ISPs parecia tornar minha conexão interrompida menos frequente.
Eu postei minha resposta aqui, pois não era uma VM do Ubuntu.
ssh -o IPQoS=throughput user@host
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 o carimbo de data / hora atual no servidor e manterá sua conexão ativa, desde que a conexão não seja interrompida por qualquer outro motivo. Quando você voltar ao terminal, basta pressionar CTRL + C e continuar trabalhando.
top
correndo
Você pode adicionar esses argumentos sempre que chamar ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3
Você não precisa editar os arquivos / etc / ssh / * config se fizer isso.
Você pode criar um alias de bash ou função ou script para facilitar isso.
Por exemplo, essas funções do bash, você pode adicionar ao .bashrc, do_ssh é usado manualmente para ativar o keepalives. do_ssh_pty é usado nos scripts para definir o 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 o keepalives estará ativo.