Maneira de evitar o tempo limite da conexão ssh e o congelamento do Terminal GNOME

235

Quando conecto via ssh a determinados servidores, ele atinge o tempo limite e "congela" o terminal (não aceita entrada, não desconecta, não é possível pressionar Ctrl-C para interromper o processo ssh ou algo assim).

Isso ocorre no Ubuntu, gnome-terminalembora pareça estar pausando a entrada / saída do terminal e não afeta a operação do próprio software do Terminal GNOME. Portanto, menos um bug do gnome-terminalque uma inconsistência irritante com o ssh.

Portanto, existe uma maneira de impedir / recuperar o terminal das conexões ssh que atingiram o tempo limite?

Kzqai
fonte
Possível duplicata de Como manter confiável um túnel SSH aberto?
Murmel

Respostas:

256

O sshd (o servidor) fecha a conexão se não ouvir nada do cliente por um tempo. Você pode dizer ao seu cliente para enviar um sinal de vida útil ao servidor de vez em quando.

A configuração para isso é no arquivo ~/.ssh/config. Para enviar o sinal a cada quatro minutos para o host remoto, coloque o seguinte em seu ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Isto é o que eu tenho no meu ~/.ssh/config.

Para habilitá-lo para todos os hosts, use:

Host *
  ServerAliveInterval 240

Certifique-se também de executar chmod 600 ~/.ssh/config, porque o arquivo de configuração não deve ser legível pelo mundo.

Ludwig Weinzierl
fonte
1
Obrigado sblair por me ajudar com a redação, é muito apreciado. Alterei "não deveria" voltar para "não devo" porque o ssh verifica as permissões do arquivo e, se é legível por mundo ou grupo, falha.
Ludwig Weinzierl
1
Não foi isso que o OP pediu. Ele não está sendo expulso por inatividade. Ele está tentando se conectar e seu terminal está congelando.
Cerin
Onde fica isso ~/.ssh/config?
Utilizador
1
@User '~ /' representa sua pasta pessoal. '.ssh' é uma pasta dentro da sua pasta pessoal.
wkm 28/01
6
isso é inútil se sua conexão está realmente sendo perdida ...
so12311
248

Imprensa Enter, ~, .um após o outro para desconectar de uma sessão congelado.

A seção "ESCAPE PERSONAGENS" na página de manual do ssh explica os detalhes subjacentes.

Peter Eisentraut
fonte
40
Parece-me que esta resposta responde com mais precisão à pergunta e, em qualquer caso, era a resposta que eu estava procurando.
precisa saber é o seguinte
Note que você precisa remover o comentário da linha EscapeChar ~em /etc/ssh/ssh_config(ou ~/.ssh/ssh_configse você preferir).
Aditya MP
@adityamenon Não, EscapeChar ~já é o padrão interno .
Peter Eisentraut
2
@Marque a pergunta "existe uma maneira de impedir que o terminal recupere as conexões ssh que atingiram o tempo limite ?" Ênfase minha.
precisa saber é o seguinte
2
Apesar de incorreto no contexto da pergunta, é exatamente isso que eu queria.
Subin Sebastian
38

Mesmo que essa não seja uma resposta direta à sua pergunta, ela está altamente relacionada ao problema que você tem. Em vez de tentar manter a conexão ativa (todas as conexões acabam), você pode usar multiplexadores de terminal, como screene tmuxque mantêm a sessão ativa em segundo plano, mesmo que seu terminal seja desconectado.

Essencialmente, ao fazer login no servidor SSH, você executa imediatamente o screenque criará e anexará uma nova sessão:

$ screen

Em seguida, prossiga e faça seu trabalho com o shell como faria normalmente. Agora, se a conexão cair, quando você puder voltar a ficar online e reconectar-se ao servidor por SSH, você verá uma lista das sessões atuais:

$ screen -ls

Para reconectar a uma sessão:

$ screen -r <session>

onde <session>é o PID ou o nome da sessão. Você será reconectado à sua sessão e poderá continuar de onde parou!

Você pode até desconectar a sessão e reconectar-se de casa para pegar o ponto exato em que parou. Para desanexar a sessão que você usa, é C-aseguido por C-d( Control + Adepois e depois Control + D).

Também existe um tutorial online simples .

Usar screene tmuxem servidores remotos é considerado uma prática recomendada e é altamente recomendado . Algumas pessoas chegam ao ponto de ter screenseu shell de login padrão; portanto, quando se conectam, iniciam imediatamente uma nova screensessão.

fotos
fonte
2
outra alternativa é usar mosh: mosh.mit.edu
Zombies
Isso é especialmente útil se você estiver usando um ponto de acesso ou wifi que ocasionalmente desiste.
Randall
11

Tente anexar -o ServerAliveInterval=30à sua string de conexão ( 30significa 30 segundos e, é claro, pode ser ajustado)

Fergie
fonte
5

Você também pode definir um intervalo de tempo limite inativo no lado do servidor SSH:

Arquivo: /etc/ssh/ssh_config

Conteúdo:

ClientAliveInterval XX
ClientAliveCountMax YY

Isso funciona exatamente da mesma maneira que a configuração do cliente, mas pacotes nulos são enviados do servidor e não do cliente.

Extraído de:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html

Ladinfremes
fonte
1

Para pessoas que desejam impedir que o cliente atinja o tempo limite em primeiro lugar.

Você pode tentar definir ConnectTimeout 0no arquivo de configuração. O valor 0 significa que a conexão será mantida ativa indefinidamente, a menos que seja fechada.

seu arquivo de configuração (ou ssh_config) pode ficar assim:

Host *
   ConnectTimeout 0
Yohannes Libanos
fonte