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?


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.


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.


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.


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)



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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.