Como impedir que o SSH se desconecte se estiver inativo por um tempo

51

Eu tenho uma conexão ssh com uma máquina que é desconectada por essa máquina após 30 minutos sem entrada do usuário. No entanto, se eu começar algo como top, a conexão permanecerá ativa. Como esta é a máquina de um cliente, não posso reconfigurar o servidor SSH dessa máquina. Então, estou procurando uma maneira de detectar automaticamente a ociosidade e iniciar algo assim top. Uma espécie de "protetor de tela" para o Bash.

Eu sei que posso fazer isso com screen, mas infelizmente screennão está instalado e não consigo instalar o software. Então, preciso usar o que o Bash oferece.

Para deixar claro: estou procurando uma solução que inicio uma vez após o login e, em seguida, quero usar esse terminal, sair, voltar duas horas depois e continuar trabalhando, sem digitar nada antes de sair. Além disso, não estou procurando encapsular coisas (por isso recomendo a ótima ferramenta sshuttle )

Alguma ideia?

Isaac
fonte
Apenas uma observação rápida para deixar a tela clara e o Keepalive não são a mesma coisa: por exemplo, se o cliente ssh ou o servidor estiver desconectado, sua sessão ssh será encerrada mesmo se você tiver o KeepAlive ativado, enquanto um shell de tela não for encerrado .
MariusMatutiae
Possível duplicata de Como manter confiável um túnel SSH aberto?
Murmel

Respostas:

78

Para deixar claro: estou procurando uma solução que inicio uma vez após o login e quero usar esse terminal, sair, voltar duas horas depois e continuar trabalhando, sem digitar nada antes de sair.

O problema é que há algo (geralmente um firewall ou balanceador de carga) que está descartando sessões inativas. Se você configurar os keepalives da sessão, os keepalives impedirão que os dispositivos de rede considerem a sessão inativa.

Correção do Linux / Unix / Cygwin OpenSSH :
A correção mais simples é ativar a manutenção de vida do cliente ssh; este exemplo envia um keepalive ssh a cada 60 segundos:

ssh -o "ServerAliveInterval 60" <SERVER_ADDRESS>

Se você deseja habilitar isso em todas as suas sessões, coloque-o em seu /etc/ssh/ssh_configou ~/.ssh/config:

ServerAliveInterval 60

Para mais informações, consulte a página de ssh_configmanual

Putty Fix :

Salve isso no seu PuTTY "Configurações padrão" ...

  • Clique em Conexão
  • Digite 60 em "Segundos entre keepalives"

putty_screenshot

Mike Pennington
fonte
21

Além da resposta de Mike Pennigton , também gostaria de informá -lo ServerAliveCountMax.

  • Ele ServerAliveIntervalenviará uma keepalive a cada x segundos (o padrão é 0 , que desativa esse recurso se não estiver definido para outra coisa).
  • Isso será feito várias ServerAliveCountMaxvezes se nenhuma resposta for recebida. O valor padrão ServerAliveCountMaxé 3 (consulte a página de manual ssh_config ).

Exemplo: se você definir ServerAliveIntervalpara 60 e deixar ServerAliveCountMaxcomo está, isso significa que a manutenção da atividade continuará aguardando apenas 3 * 60 = 180 seconds = 3 minutos antes de sair.

Para aumentar isso para, por exemplo, 2 horas tentando manter a conexão ativa, você pode:

Por comando:

Portanto, você deve considerar definir

ssh -o "ServerAliveInterval 60" -o "ServerAliveCountMax 120" <SERVER_ADDRESS>

Persistente:

Para torná-lo persistente, grave-o em /etc/ssh/ssh_config(será aplicado em todo o sistema) ou ~/.ssh/config(somente em usuários):

ServerAliveInterval 60
ServerAliveCountMax 120

Nota

Como dislick apontou corretamente , isso pode não ser o que você deseja, dependendo da sua situação:

  • Se você deseja encerrar a sessão rapidamente assim que o servidor não responder mais, escolha um valor baixo para ServerAliveCountMax.
  • Se você estiver mais interessado em manter uma conexão já estabelecida (por exemplo, você treina e tem uma latência alta), escolha um valor mais alto para ServerAliveCountMaxpermitir sshcontinuar tentando restabelecer a conexão.

Veja também:

Murmel
fonte
1
Sinto muito, mas isso está errado. ServerAliveCountMaxespecifica a quantidade de mensagens ativas do servidor que podem ser enviadas sem receber nenhuma mensagem do servidor. Se você deseja sshsair após o congelamento (para poder reiniciá-lo), defina ServerAliveCountMaxum número baixo . Veja a página de manual OP vinculada.
desmarque
@dislick Eu tive que pensar um pouco sobre isso, mas acho que você está certo dependendo do contexto, por isso adicionei uma nota para enfatizar o contexto.
Murmel 23/09
2

Estou usando o Mobaxterm e também encontrei esse problema. O Mobaxterm também é fornecido com uma opção para manter o cliente ativo quando ele estiver ocioso. Vá para Settings -> Configuration -> SSH. Há uma seção intitulada SSH settings, marque a opção SSH keepalive. Então o problema deve desaparecer.

insira a descrição da imagem aqui

jdhao
fonte
funciona o "SSH keepalive" na edição gratuita ... minha sessão está sendo desconectada mesmo depois de verificar esta opção
samshers
Sim, funciona. Seu problema pode ter outras causas.
jdhao 5/08