Como posso sair do ssh quando ele bloqueia?

330

Freqüentemente eu ssh na minha caixa em casa da escola, mas geralmente quando eu mudo de classe e meu computador é suspenso, o tubo será quebrado. No entanto, ssh simplesmente trava - Ctrl + c , Ctrl + z e Ctrl + d não tem efeito.

É chato ter que reiniciar meu terminal, e ainda mais irritante ter que fechar e recriar uma nova janela de tela.

Então, minha pergunta, existe uma maneira fácil de fazer o ssh morrer corretamente (ou seja, quando o tubo falha "normalmente" ele sairá com uma mensagem sobre um cano quebrado)? Ou eu tenho que descobrir o que é o PID e matá-lo manualmente?

    
O
por Wayne Werner 11.03.2011 / 17:22

3 respostas

455

As chaves normais são encaminhadas pela sessão ssh , portanto, nenhuma delas funcionará. Em vez disso, use as seqüências de escape. Para matar a sessão atual pressione Enter , ~ , . .

Mais destas sequências de escape podem ser listadas com Enter , ~ , ? :

Supported escape sequences:
  ~.  - terminate session
  ~B  - send a BREAK to the remote system
  ~R  - Request rekey (SSH protocol 2 only)
  ~#  - list forwarded connections
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

Você pode fechar a lista de seqüências de escape pressionando enter .

Observe que, ao pressionar ~ ~ , o ssh enviará o ~ em vez de interceptá-lo, você pode endereçar N aninhado ssh conexões atingindo ~ N vezes. (Isto só se aplica a ~ s que segue diretamente um enter .) Isto é para dizer que entra ~ < kbd> ~ ~ ~ ~ . termina uma camada de ssh com 5 camadas de profundidade e mantém os outros 4 intactos.

    
por geekosaur 11.03.2011 / 18:18
48

Você também pode configurar keep-alives em nível de aplicativo para que o SSH impeça de congelar em problemas de conexão. Meu ~/.ssh/config contém isso:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

Isso faz com que o cliente ssh envie keep-alives em nível de aplicativo a cada 15 segundos. Sempre que três deles falharem consecutivamente (o padrão de ServerAliveCountMax ), o cliente considera a conexão como suspensa e a fecha.

Em oposição à outra opção TCPKeepAlive , isso é verificado dentro do canal criptografado e não é spoofable.

Está sendo notado que esses keep-alives também ajudam a manter conexões long-idling ativas, ou seja, impedir que você tenha semifechadas penduradas por horas sem serem tocadas.

Eu recomendo strongmente ativar esse recurso se você se deparar com isso regularmente, mas você também deve saber sobre o pequeno risco de segurança que ele pode impor. Um ataque de texto plano conhecido pode se tornar mais fácil se o invasor souber o intervalo e o conteúdo de uma conexão inativa. Isso pode ser o motivo pelo qual ele não está ativado por padrão.

    
por ulidtko 11.03.2011 / 19:51
37

Como observado na resposta do geekosaur, a seqüência de escape ~. terminará a conexão.

A lista completa de seqüências de escape e o que elas fazem pode ser exibida digitando ~? :

Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
    
por scottl 15.03.2011 / 07:39

Tags