2010-01-20 23:33:01 +0000 2010-01-20 23:33:01 +0000
236
236

Forma de evitar o tempo limite de ligação ssh e o congelamento do Terminal GNOME

Quando me ligo através do ssh a certos servidores, o timeout e “congela” o terminal (não aceita entrada, não desliga, não pode Ctrl-C para matar o processo ssh ou qualquer coisa).

Isto está no Ubuntu gnome-terminal embora pareça estar a pausar a entrada/saída do terminal, e não afecta o funcionamento do próprio software do Terminal GNOME. Portanto, menos um bug com gnome-terminal do que uma irritante incoerência com o ssh.

Então, existe alguma forma de prevenir/recuperar o terminal de ligações ssh que tenham temporizado?

Respostas (7)

259
259
259
2010-01-20 23:53:48 +0000

sshd (o servidor) fecha a ligação se não ouvir nada do cliente durante algum tempo. Pode dizer ao seu cliente para enviar um sinal de sinal de vida para o servidor de vez em quando.

A configuração para isto está no ficheiro ~/.ssh/config. Para enviar o sinal de quatro em quatro minutos para o servidor remoto, coloque o seguinte no seu ficheiro ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

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

Para permitir a sua utilização por todos os anfitriões:

Host *
  ServerAliveInterval 240

Também certifique-se de executar chmod 600 ~/.ssh/config, porque o ficheiro de configuração não deve ser legível em todo o mundo.

250
250
250
2010-01-20 23:44:01 +0000

Prima Enter, ~, . um após o outro para se desligar de uma sessão congelada.

A secção “ESCAPE CHARACTERS” na página ssh man explica os detalhes subjacentes.

39
39
39
2012-07-03 01:28:14 +0000

Mesmo que isto não seja uma resposta directa à sua pergunta, está altamente relacionado com o problema que tem. Em vez de tentar manter a ligação viva (todas as ligações eventualmente morrem) pode usar multiplexadores de terminal, como screen e tmux que mantêm a sessão viva em segundo plano, mesmo que o seu terminal seja desligado.

Essencialmente quando faz login no servidor SSH executa imediatamente screen que irá criar e anexar uma nova sessão:

$ screen

Depois vai em frente e faz o seu trabalho com a shell como faria normalmente. Agora, se a ligação cair, quando puder voltar a estar online e voltar a ligar-se ao servidor através do SSH, obterá uma lista das sessões actuais com:

$ screen -ls

Para voltar a ligar a uma sessão:

$ screen -r <session>

onde <session> é o PID ou o nome de uma sessão. Será reconectado à sua sessão e poderá continuar de onde parou!

Pode até desligar a sessão e voltar a ligar-se a partir de casa para retomar a partir do ponto exacto em que parou. Para desligar a sessão usa C-a seguido de C-d& (ou seja Control + A e depois Control + D).

Existe também tutorial simples online .

Usando screen e tmux em servidores remotos é considerado uma prática melhor* e é elevadamente recomendado*. Algumas pessoas chegam ao ponto de ter screen como a sua shell de login predefinida, por isso quando se ligam iniciam imediatamente uma nova sessão screen.

12
12
12
2014-02-06 14:13:27 +0000

Tente anexar -o ServerAliveInterval=30 à sua linha de ligação (30 significa 30 segundos e pode, claro, ser ajustado)

6
6
6
2016-02-12 22:45:27 +0000

Também se pode definir um intervalo de tempo de inactividade do lado do servidor SSH:

Ficheiro: /etc/ssh/ssh_config

Conteúdo:

ClientAliveInterval XX
ClientAliveCountMax YY

Isto funciona exactamente da mesma forma que a configuração do cliente, mas os pacotes nulos são enviados a partir do servidor, e não do cliente.

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

2
2
2
2015-12-17 02:19:43 +0000

Para as pessoas que querem impedir o cliente de cronometrar em primeiro lugar.

Poderá tentar definir ConnectTimeout 0 no ficheiro de configuração. O valor 0 significa que a ligação será mantida viva Indefinidamente, a menos que seja fechada.

o seu ficheiro de configuração (ou ssh_config) poderá ter este aspecto:

Host *
   ConnectTimeout 0
0
0
0
2020-01-24 11:55:41 +0000

No meu caso, o problema estava no grande tamanho da MTU. Pode-se mudar o MTU no router se se utilizar NAT, mas eu mudo o MTU no servidor:

sudo /sbin/ifconfig eth0 mtu 1036
sudo /etc/init.d/networking restart

No Windows também pode aumentar esta chave:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpMaxDataRetransmissions"=dword:00000010