Como posso sair do ssh quando ele bloqueia?

380

Frequentemente eu ssh na minha caixa em casa da escola, mas geralmente quando eu mudo de classe e meu computador é suspenso, o cano fica quebrado. No entanto, o ssh simplesmente trava - Ctrl+ c, Ctrl+ ze Ctrl+ dnão têm efeito.

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

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

Wayne Werner
fonte
Se eu fui desconectado com uma sessão SSH ativa, ela congela. Eu simplesmente o mato e começo uma nova sessão. Nenhuma informação é perdida porque eu uso a tela GNU.
Lekensteyn
Eu também - a tela é a melhor. Mas ainda é chato ter que screen -x: P
Wayne Werner
[mosh] (mosh.mit.edu) é uma alternativa interessante para evitar esse problema. Ele "permanece conectado", mesmo com conectividade intermitente à Internet.
Jaynp
@jaynp A desvantagem de eu usar o mosh (há dois minutos) é que não sei como desconectá-lo. Estou usando uma sessão tmux + irssi em um host remoto (como um segurança IRC, mais ou menos) e quero desconectar algumas vezes (mantendo o tmux + irssi em execução) e o que fiz com <enter> + ~ +. usando SSH, mas não funcionará usando mosh.
Pavel Šimerda

Respostas:

534

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

Mais destas sequências de escape podem ser listados 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 ~~causa sshpara enviar o em ~vez de interceptá-lo, você pode endereçar Nssh conexões aninhadas pressionando ~ N vezes. (Isso só se aplica a ~s que seguem diretamente um enter.) Ou seja, enter~~~~~.encerra uma sshsessão com 5 camadas de profundidade e mantém as outras 4 intactas.

geekosaur
fonte
48
Para layouts de teclado em que ~há uma tecla morta , a sequência de teclas é Enter ~ Space ..
Søren Løvborg
1
Eu adicionei mais seqüências de escape que podem ser úteis. :)
gertvdijk
5
Note que você precisa remover o comentário da linha EscapeChar ~em /etc/ssh/ssh_config(ou ~/.ssh/ssh_configse você preferir).
Aditya MP
6
@Hitechcomputergeek Enter ~ ~ .Como ~ ~envia um literal ~através da sua sessão SSH, a segunda sessão SSH o receberá como um único til e os interpretará .como parte da fuga. Para enviar para a quinta sessão ssh aninhada, basta usar 5 tildes na sua sequência de escape.
Score_Under
4
mudança de vida;)
artm 17/03/2019
54

Você também pode configurar o keep-alives no nível do aplicativo para o SSH para impedir que ele congele em problemas de conexão. My ~/.ssh/configcontém isso:

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

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

Ao contrário da outra opção TCPKeepAlive, isso é verificado no canal criptografado e não é falsificado.


Note-se que esses keep-alives também ajudam a manter as conexões inativas por muito tempo ativas , ou seja, impedem que você tenha sessões tcp semi-fechadas suspensas por horas intocadas.

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

ulidtko
fonte
3
Razões de segurança. Você pode tomar um drink e deixar o ssh sessio aberto e seu parceiro de laboratório com quem você trabalhou nos últimos 20 anos pode usar sua sessão para seqüestrar o servidor e destruí-lo ... enquanto você bebia no intervalo de 10 minutos.
Luis Alvarado
2
@CYREX, eh? E como a opção padrão desativada impede que você tenha parceiros de laboratório injustos? %)
11111 ulidtko
1
@ulidtko: Existe algum motivo para não definir ServerAliveInterval1 para que uma conexão perdida seja detectada imediatamente?
precisa saber é
2
@gertvdijk: Obrigado. Para mim, funciona mesmo sem a Hostlinha. Além disso, "cifras modernas, como o Advanced Encryption Standard, atualmente não são suscetíveis a ataques de texto sem formatação conhecidos". (a partir do link que você adicionou) ...
krlmlr 19/01
2
você também pode substituir o SSH pelo Mosh (shell móvel). O Mosh se conecta ao servidor via SSH, mas estabelece um canal baseado em UDP que resiliente contra problemas de conexão. O Mosh também tem um eco local, para que você possa ver o que está digitando, mesmo que o servidor não esteja respondendo. Quando as teclas são entregues, Mosh marca o texto ecoado. mosh.mit.edu
Pascal Rosin
41

Conforme observado na resposta do geekosaur, a sequência de escape ~.encerrará a conexão.

A lista completa de seqüências de escape e o que elas fazem podem ser exibidas 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.)
scottl
fonte
Como fecho a lista de sequências de escape?
precisa
3
Depois de imprimir a lista de sequências de escape, você não estará pronto para aceitar a próxima.
Tejas Kale