54 pontos por GN⁺ 2026-03-13 | 5 comentários | Compartilhar no WhatsApp
  • Quando uma sessão SSH trava, você pode controlar várias ações pelo menu de sequências de escape embutido no SSH sem precisar forçar o encerramento do processo
  • Dentro da sessão, após pressionar ↵Enter e digitar ~?, é exibida uma lista de comandos ocultos; com ~. é possível encerrar a conexão imediatamente em qualquer situação
  • Essas sequências de escape ficam embutidas no próprio cliente SSH, então funcionam mesmo que o servidor não responda ou a conexão esteja interrompida
  • Em sessões SSH aninhadas, é possível usar ~~ para passar a sequência ao cliente interno
  • Além disso, o texto também apresenta opções úteis do SSH como -C, -v e -D

Menu de sequências de escape do SSH

  • Dentro de uma sessão SSH, pressione ↵Enter e depois digite ~? para ver a lista de sequências de escape compatíveis
  • Principais sequências:
    • ~. — encerra a conexão (incluindo sessões multiplexadas)
    • ~B — envia um sinal BREAK ao sistema remoto
    • ~C — abre a linha de comando (permite configurar encaminhamento de porta; digite help para ver a ajuda)
    • ~R — solicita rekey
    • ~V/v — aumenta/diminui a verbosidade (LogLevel)
    • ~^Zsuspende o SSH
    • ~# — mostra a lista de conexões encaminhadas
    • ~& — coloca o SSH em segundo plano (quando estiver aguardando o encerramento da conexão)
    • ~~ — envia o próprio caractere de escape (digitando duas vezes)
  • Como essas sequências são embutidas no próprio cliente SSH, elas funcionam mesmo quando o servidor SSH não responde ou a conexão foi interrompida
  • A mais útil é ~., que permite encerrar a sessão imediatamente em qualquer situação quando ela trava
  • As sequências de escape só são reconhecidas logo após uma nova linha (newline)

Uso em sessões SSH aninhadas

  • Em um ambiente aninhado, no qual você abre outra conexão SSH dentro de uma sessão SSH, é possível usar ~~ para passar a sequência ao cliente interno
  • Exemplo:
  pinkie@stable:~$ ssh ponyville        # stable  
  pinkie@ponyville:~$ ssh manehatten    # stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to manehatten closed. # ↵Enter `~~.`  
  pinkie@ponyville:~$                   # stable › ponyville  
  pinkie@ponyville:~$ ssh manehatten stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to ponyville closed. # ↵Enter `~.`  
  pinkie@stable:~$                      # stable  
  • No estado stable → ponyville → manehatten
  • Ao digitar ~~., apenas a sessão mais interna (manehatten) é encerrada, retornando para ponyville
  • Ao digitar ~., até a sessão intermediária (ponyville) é encerrada, retornando para stable

Opções bônus do SSH

  • ssh -C — ativa compressão gzip; a documentação diz que isso é desnecessário em redes rápidas, mas ao usar TUI ou exibir grandes volumes de logs pode trazer grandes ganhos de latência e responsividade
  • ssh -v — ativa logging detalhado (-vv, -vvv exibem ainda mais informações); útil para distinguir se uma conexão lenta ou com equipamento modesto, como um Raspberry Pi, realmente travou ou está apenas demorando
  • ssh -D 1234 — cria um proxy SOCKS em localhost:1234, permitindo acessar a rede por meio do servidor; pode ser útil para tarefas na LAN do servidor ou como uma VPN caseira simples

5 comentários

 
t7vonn 2026-03-13

Uau, realmente é uma função que eu nunca tinha visto; agora não vou mais precisar fechar o terminal.

 
xguru 2026-03-13

Uau... usando SSH há mais de dez anos, essa é a primeira vez que vejo esse recurso.
Realmente aparece um menu.

 
bus710 2026-03-13

Desligue o equipamento
Ah......

 
GN⁺ 2026-03-13
Comentários do Hacker News
  • Eu queria defender com mais força as manpages. A maioria das manpages de código aberto tem alta qualidade, e algumas são realmente excelentes
    Mas há problemas com a própria ferramenta man. Por exemplo, tentei encontrar a sintaxe de escape ~? do cliente openssh, mas ela não aparecia na busca da manpage
    O motivo é que o man converte o caractere ~ para um til estranho em Unicode, então não dá para usar grep. O mesmo acontece com o caractere -, que também é transformado e deixa de ser encontrável
    Isso é fatal para a documentação de ferramentas de linha de comando. Esse tipo de conversão deveria vir desativado por padrão

    • Não sei sobre o problema de conversão de caracteres, mas dá para fazer uma busca literal com ctrl-r (/<ctrl-r>~?)
    • No less, que é o pager padrão do Debian, funciona bem
    • Resolvi com a opção man -E ascii. Meu ambiente é Cygwin 3.6.6, então pode ser diferença de distribuição
    • Se você usar o neovim como pager, a busca por ~? funciona bem. Só precisa saber o escape de regex (\~?)
    • No macOS e no CentOS, a busca por \~\? também funciona bem
  • Eu já usava o atalho ~. há muito tempo, mas não conhecia o menu de ajuda
    Se você digitar ~ duas vezes, pode enviar o caractere til literal, e em uma sessão normal ele não é reconhecido como escape a menos que seja o primeiro caractere digitado
    Ou seja, ~ só funciona como escape quando é o primeiro caractere da linha e vem logo após uma nova linha. O design da UI é bem cuidadoso

    • Para os leitores mais jovens: no modo echo do terminal, o backspace na verdade não apaga o buffer de entrada
      Então pode sair algo como ls ~/^?^?^?^?^?~/a.out. O SSH monitora o fluxo de entrada, não a tela
    • A desvantagem é que, quando a sessão trava, para encerrar com ~. você precisa pressionar Enter primeiro, e isso pode acabar sendo enviado ao servidor
  • Eu uso SSH há mais de 15 anos, mas é a primeira vez que ouço falar dessas sequências de escape
    Da próxima vez que uma sessão travar, com certeza vou usar ~.. Parece muito melhor do que fechar o terminal

    • Se a sua conexão SSH cai com frequência, pode ser por causa de um timeout TCP curto no CGNAT
      Dá para resolver usando VPN ou Tailscale, ou então ajustando o parâmetro tcp_keepalive para manter a conexão viva
      Exemplo de configuração:
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      Assim a sessão continua ativa mesmo em ambiente com CGNAT
    • Eu uso ~. toda semana há 20 anos. Passar a opção -v para o SSH também ajuda no debug de problemas de conexão
    • Ao encadear várias conexões SSH, você pode usar ~~. para encerrar o segundo hop
    • Eu também uso isso há quase 30 anos, e antes disso usava rsh. Veja Berkeley r-commands
    • Antes de digitar ~., você precisa pressionar Enter e começar em uma nova linha
  • Eu também usava ~. há muito tempo, mas não conhecia os outros escapes. No prompt do shell não funciona de imediato, então é preciso executar cat e depois digitar ~?

    • Mesmo assim funciona. O OpenSSH monitora apenas a entrada, não a saída, então <enter>~. encerra a sessão
    • Eu também sempre encerrava sessões com ~., mas não sabia que ~ só funcionava em uma nova linha. ~^Z também parece útil
      Isso me lembra a sequência ctrl-[ do telnet
    • O cliente SSH reconhece escapes mesmo sem saber em que modo a sessão remota está. O Enter só serve para preparar uma nova entrada de escape
  • Na verdade, esses recursos vieram do rsh. Eu lembro disso porque sou mais velho

    • Na verdade, o estilo de comandos com ~ apareceu primeiro no cu(1). Isso é anterior ao rsh, da época do 4.1BSD
    • Hoje em dia, para usar scp como se fosse o rcp, é preciso passar a opção -O
    • Como alguém que lembra da época do uucp!bangpath, isso me faz rir
  • O menu do SSH é útil quando se faz tunelamento. Hoje isso às vezes é substituído por coisas como Tailscale, mas ainda continua útil

    • Quando abro “nova conexão” em uma nova aba, uso o recurso ControlMaster
      Ele multiplexa várias sessões SSH em uma só, então não preciso repetir autenticação e o autocompletar fica mais rápido
      Só que, quando a conexão trava, fica um pouco chato
    • Eu uso bastante o tuns.sh. É prático porque permite expor o localhost para fora
  • Mais do que “secreto”, isso é algo que pouca gente conhece porque a maioria não lê a manpage até o fim

  • O escape ~ já era usado no cu do UNIX dos anos 1970. O SSH pode ser visto como um descendente disso

  • A configuração padrão do ControlMaster é meio ruim, então vale a pena adicionar um bloco como este

    Host *
      ControlMaster auto
      ControlPath ~/.ssh/sockets/%r@%h:%p
      ControlPersist 10m
    

    Assim, conexões SSH/scp/rsync para o mesmo host reutilizam a conexão existente
    Você também pode adicionar encaminhamento de porta no meio da sessão com o escape ~C

    • Se aumentar o ControlPersist para algo como 1 hora, a conexão continua viva mesmo com intervalos curtos entre logins
    • Também teve a piada de que este comentário parecia ter sido escrito por um LLM
  • Eu também só conseguia recuperar uma sessão SSH travada com [Enter] ~.
    Parece mesmo um recurso escondido que quem não é especialista em Linux dificilmente conhece

 
kayws426 2026-03-13

Eu sabia disso, mas quase nunca tive utilidade para isso. (...)