Questão Como posso sair do ssh quando ele trava?


Eu freqüentemente ssh em minha caixa em casa da escola, mas geralmente quando eu mudo de classe e meu computador suspende, 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?


343
2018-03-11 16:22


origem


Se eu me desconectei de uma sessão SSH ativa, ela congela. Eu apenas 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 boa alternativa para evitar esse problema. Ele "permanece conectado" mesmo com conectividade de internet intermitente. - jaynp
@jaynp A desvantagem de eu usar o mosh (desde dois minutos atrás) é que eu não sei como desconectá-lo. Eu estou usando uma sessão tmux + irssi em um host remoto (como um segurança do IRC, mais ou menos) e eu quero desligar algumas vezes (mantendo o tmux + irssi em execução) e que eu fiz com <enter> + ~ +. usando SSH, mas não funciona usando mosh. - Pavel Šimerda


Respostas:


Teclas normais são encaminhadas sobre o ssh sessão, então nenhum desses funcionará. Em vez disso, use as seqüências de escape. Para matar a sessão atual, acertar subseqüentemente Enter ↵, ~, ..

Mais dessas seqüê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 entrar.

Observe que porque bater ~~ causas ssh para enviar o ~ em vez de interceptar, você pode resolver N aninhado ssh conexões, batendo ~  N vezes. (Isto só se aplica a ~s que seguem diretamente um entrar.) Isso quer dizer que entrar~~~~~. termina um ssh Sessão 5 camadas profundas e mantém os outros 4 intactos.


478
2018-03-11 17:18



Para layouts de teclado onde ~ é um chave morta, a sequência chave é Enter  ~  Space  .. - Søren Løvborg
Eu tenho adicionado mais das seqüências de escape que podem ser úteis. :) - gertvdijk
Note que você precisa descomentar a linha EscapeChar ~ dentro /etc/ssh/ssh_config (ou ~/.ssh/ssh_config se você preferir). - Aditya M P
@Hitechcomputergeek Enter  ~  ~  . Desde a ~  ~ envia um literal ~ através da sua sessão SSH, a segunda sessão SSH irá recebê-lo como um único til e irá interpretar o . como parte da fuga. Para enviar para a 5ª sessão ssh aninhada, use apenas 5 tis na sua sequência de escape. - Score_Under
mudança de vida ;) - artm


Você também pode querer configurar o nível do aplicativo manter-alives para SSH para evita ele de congelamento em problemas de conexão. Minhas ~/.ssh/config contém isto:

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 aqueles que vivem também ajudam a, uhm, manter de longa duração conexões vivas, ou seja, impedir que você tenha meio fechado sessões de tcp penduradas por horas intocadas.

Eu recomendo fortemente ativar esse recurso se você se deparar com isso regularmente, mas você também deve saber sobre o pequeno risco de segurança que pode impor. UMA 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.


51
2018-03-11 18:51



Razões de segurança. Você poderia ir beber 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ê estava bebendo em seu intervalo de 10 minutos. - Luis Alvarado♦
@CYREX, eh? E como pode a opção padrão desativada impedir que você tenha parceiros de laboratório injustos? %) - ulidtko
@ulidtko: Existe alguma razão para não definir ServerAliveInterval 1 para que uma conexão perdida seja detectada imediatamente? - krlmlr
Eu tenho melhorou o post com o meu conhecimento sobre isso junto com outras 'correções'. Acho que não é a responder à pergunta, pois é mais sobre a prevenção, em vez de consertar uma já quebrada. - gertvdijk
@ gertvdijk: Obrigado. Para mim, funciona mesmo sem o Host linha. Além disso, "cifras modernas, como o Advanced Encryption Standard, não são atualmente suscetíveis a ataques de texto puro conhecidos". (do link que você adicionou) ... - krlmlr


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.)

39
2018-03-15 06:39



Como faço para fechar a lista de seqüências de escape? - kristianp
Você não, depois de imprimir a lista de seqüências de escape, está pronta para aceitar a próxima. - Tejas Kale