SSH travando: problema local suspeito, não remoto

2

No meu computador de trabalho, eu regularmente SSH em dois servidores não relacionados. Às vezes, a sessão SSH é bloqueada (não responde à entrada do teclado). Quando bloqueado, eu posso SSH através de um segundo terminal aberto, que funciona, mas não descongela o terminal congelado. Pressionar ~. leva algum tempo antes que o terminal se desconecte e me forneça uma CLI local. Eu regularmente SSH em ambos os servidores de casa sem problemas, então eu suspeito que o problema está no meu computador de trabalho local.

O problema ocorre com outros terminais? Sim, o problema ocorre com o Konqueror e com o Terminator.

O problema ocorre em ambos os servidores remotos ao mesmo tempo? Não

O problema ocorre com qualquer aplicativo específico em execução no servidor? Ambos com e sem o GNU Screen, tanto no CLI quanto no VIM.

Para testar, acabei de abrir quatro terminais: dois terminais Konqueror, um para cada servidor; e dois terminais Terminator, um para cada servidor. Após cerca de uma hora, apenas um terminal (Terminator) foi trancado. O outro terminal para o mesmo servidor não bloqueou e nenhum terminal para o outro servidor foi bloqueado. Claro, eu tentei Ctrl-Q no terminal trancado para ver se um Ctrl-S errante tinha sido enviado, mas isso não resolveu o problema. A tela não estava sendo executada no terminal que estava bloqueado (nem na sessão nativa que está executando o SSH, nem na própria sessão SSH).

UPDATE: Uma hora depois o servidor travado no Terminator finalmente desconectou com "Write failed: Broken pipe" e eu tenho uma CLI local de trabalho, e os dois servidores no Konsole também estão travados .

    
por dotancohen 14.01.2013 / 14:04

1 resposta

6

Algo ao longo da cadeia está expirando a conexão ociosa, já que o SSH normalmente não envia nada quando ocioso. Mas você pode enviar mensagens periodicamente quando ocioso. No OpenSSH versão 3.8 e superior:

$ ssh -oServerAliveInterval=60 myremotebox

Se você estiver indo para ssh manualmente para esse host com frequência, provavelmente desejará colocá-lo em seu arquivo ~/.ssh/config :

Host myremotebox
    ServerAliveInterval=60

Isto diz para enviar um pacote nulo a cada 60 segundos depois que nada mais foi enviado. Eu encontrei através de uma ampla variedade de infra-estrutura que isso é suficiente para manter a conexão viva.

Nas versões pré-3.8 do OpenSSH, você não tem essa opção, mas há um fallback fraco. Você pode definir a opção KeepAlive , que usa TCP Keepalives . A maneira como isso funciona depende do sistema operacional e, muitas vezes, a alteração do comportamento afeta todos os aplicativos. Pior ainda, as pilhas de rede costumam usar como padrão o envio de keepalives TCP a cada 2 horas, então você quase tem para alterar o padrão se for usá-lo dessa maneira, pois a conexão de SSH é temporizada provavelmente tem um limite de inatividade muito inferior a 2 horas.

Por favor, note que se você está lendo a versão 3.8+, isso é a mesma coisa que a opção TCPKeepAlive . Quando eles adicionaram a opção "server alive" em 3.8, eles renomearam KeepAlive para TCPKeepAlive para distinguir os dois.

    
por 14.01.2013 / 14:22