- 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)
~^Z — suspende 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
Uau, realmente é uma função que eu nunca tinha visto; agora não vou mais precisar fechar o terminal.
Uau... usando SSH há mais de dez anos, essa é a primeira vez que vejo esse recurso.
Realmente aparece um menu.
Desligue o equipamento
Ah......
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 manpageO 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ávelIsso é fatal para a documentação de ferramentas de linha de comando. Esse tipo de conversão deveria vir desativado por padrão
ctrl-r(/<ctrl-r>~?)less, que é o pager padrão do Debian, funciona bemman -E ascii. Meu ambiente é Cygwin 3.6.6, então pode ser diferença de distribuiçãoneovimcomo pager, a busca por~?funciona bem. Só precisa saber o escape de regex (\~?)\~\?também funciona bemEu já usava o atalho
~.há muito tempo, mas não conhecia o menu de ajudaSe 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 digitadoOu seja,
~só funciona como escape quando é o primeiro caractere da linha e vem logo após uma nova linha. O design da UI é bem cuidadosoEntão pode sair algo como
ls ~/^?^?^?^?^?~/a.out. O SSH monitora o fluxo de entrada, não a tela~.você precisa pressionar Enter primeiro, e isso pode acabar sendo enviado ao servidorEu 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 terminalDá para resolver usando VPN ou Tailscale, ou então ajustando o parâmetro
tcp_keepalivepara manter a conexão vivaExemplo de configuração: Assim a sessão continua ativa mesmo em ambiente com CGNAT
~.toda semana há 20 anos. Passar a opção-vpara o SSH também ajuda no debug de problemas de conexão~~.para encerrar o segundo hop~., você precisa pressionar Enter e começar em uma nova linhaEu 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 executarcate depois digitar~?<enter>~.encerra a sessão~., mas não sabia que~só funcionava em uma nova linha.~^Ztambém parece útilIsso me lembra a sequência ctrl-[ do telnet
Entersó serve para preparar uma nova entrada de escapeNa verdade, esses recursos vieram do rsh. Eu lembro disso porque sou mais velho
~apareceu primeiro no cu(1). Isso é anterior ao rsh, da época do 4.1BSDscpcomo se fosse o rcp, é preciso passar a opção-OO menu do SSH é útil quando se faz tunelamento. Hoje isso às vezes é substituído por coisas como Tailscale, mas ainda continua útil
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
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 dissoA configuração padrão do ControlMaster é meio ruim, então vale a pena adicionar um bloco como este
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
~CControlPersistpara algo como 1 hora, a conexão continua viva mesmo com intervalos curtos entre loginsEu 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
Eu sabia disso, mas quase nunca tive utilidade para isso. (...)