saia de todas as conexões SSH em um comando e feche o PuTTY

18

Existe uma maneira de voltar atrás em todas as conexões SSH e fechar o PuTTY em "one shot"? Eu trabalho no Windows 7 e uso PuTTY para SSH para vários hosts Linux.

Um exemplo da maneira como me vejo trabalhando:

SSH to host1 with PuTTY...
banjer@host1:~> #...doin some work...ooh! need to go check something on host8...
banjer@host1:~> ssh host8
banjer@host8:~> #...doin some work...OK time for lunch. lets close putty...
banjer@host8:~> exit
banjer@host1:~> exit
Putty closes.

Por acima, alguma maneira de passar do host8 para fechar o PuTTY de uma só vez? Às vezes me encontro com 5 ou 10 hosts de profundidade. Sei que posso clicar no X para fechar a janela PuTTY, mas gosto de garantir que minhas conexões SSH sejam fechadas corretamente usando o comando exit. Também percebo que estou pedindo dicas sobre como aumentar a preguiça. Vou escrever como "como posso ser mais eficiente".

Banjer
fonte
6
Não diretamente o que você está perguntando, mas que tal pressionar ctrl+dvárias vezes?
precisa
@UlrichDangel Eu nunca usei isso antes, mas também uma maneira rápida de sair de conexões rapidamente.
Banjer
2
Você está realmente aninhando sessões ssh com 5 a 10 níveis de profundidade? Você percebe que está criando um túnel complicado que rejeita todos os pacotes em sua sessão ssh por todos esses hosts? Você poderia resolver o problema simplesmente não aninhando sessões ssh?
Jw013 07/11
@ jw013 Não, eu não percebi isso, mas faz sentido. Honestamente, os níveis de 5 a 10 eram um exagero, mas eu estava tentando ilustrar minha pergunta de "como sair corretamente de Putty de uma só vez".
Banjer

Respostas:

29

Tente usar a sshsequência de escape da terminação da conexão.

Na sshsessão, insira ~.(til ponto). Você não verá os caracteres ao digitá-los, mas a sessão será encerrada imediatamente.

$ ~.
$ Connection to me.myhost.com closed.  

A partir de man 1 ssh

The supported escapes (assuming the default ‘~’) are:
 ~.      Disconnect.
 ~^Z     Background ssh.
 ~#      List forwarded connections.
 ~&      Background ssh at logout when waiting for forwarded 
         connection / X11 sessions to terminate.
 ~?      Display a list of escape characters.
 ~B      Send a BREAK to the remote system (only useful for SSH protocol
         version 2 and if the peer supports it).
 ~C      Open command line.  Currently this allows the addition of port 
         forwardings using the -L, -R and -D options (see above). It also
         allows the cancellation of existing remote port-forwardings using 
         -KR[bind_address:]port.  !command allows the user to execute a 
         local command if the PermitLocalCommand option is enabled in
         ssh_config(5).  Basic help is available, using the -h option.
 ~R      Request rekeying of the connection (only useful for SSH protocol 
         version 2 and if the peer supports it).
George M
fonte
Muito legal! Alguma maneira de colocar ~.um apelido ou função? Só para dar um nome fácil de lembrar exitall. Agora estou pedindo demais :). Eu tentei algumas coisas, ~/.bashrcmas entendo -bash: ~.: command not found. Suponho que o bash o veja como uma string e não como uma sequência de escape vinda diretamente do teclado.
Banjer
Também gosto da ctrl+dsolução, mas isso responde mais diretamente à minha pergunta. Obrigado a todos.
Banjer
3
@Banjer bash nunca vê ~., é tratado por sshsi só.
Gilles 'SO- stop be evil'
@ Gotcha pegadinha, faz sentido.
Banjer
E não há garantia de que o PuTTY também faça isso. O sshcliente CLI precisa dessa técnica porque é CLI. O PuTTY é um aplicativo de GUI e existem maneiras muito mais amigáveis ​​de fazer essas coisas em uma GUI.
Alexs:
11

Basta pressionar CtrlDe você será desconectado, mantendo pressionada a tecla ctrl e pressione "d" até a janela desaparecer.

Joe
fonte
11
Infelizmente, isso não funciona universalmente. Qualquer sessão executando um editor ou outra ferramenta de tela cheia provavelmente ignora EOT. E até basho ignorará no meio de uma linha de comando. Experimente você mesmo: digite uma única letra e tente Ctrl-D.
Alexios30:
O que Ctrl + D faz, quero dizer, existe com segurança ou apenas mata o processo?
AMB
Sai com segurança. É um atalho de shell que é o mesmo que digitar 'exit' e pressionar enter.
Joe
Na verdade, o meu problema (windows git bash e ubuntu bash) a logout.
velis
sim, acredito que exit também chama logout, pois as conexões ssh tendem a não ser sessões de login.
Joe
9

Basta fechar o PuTTY. ( Alt+ F4por padrão IIRC.)

Gilles 'SO- parar de ser mau'
fonte
2

Outra maneira é fazer functionpara ssh:

   function ssh(){ /usr/bin/ssh $@ ; exit ; } 

Infelizmente, ele também sempre fechará a conexão e o logout do console depois que você terminar o trabalho no sistema remoto.

Observe que você precisa fazer essa função em todos os seus servidores, caso contrário, esse hack não funcionará. Mas você sempre pode colocar a função em ~ / .bashrc ou ~ / .whatever_shell_you_use_rc.

Parece um hack um pouco sujo em comparação com o jeito de uther.

pressa
fonte
functionnão é POSIX - basta remover a palavra-chave e é necessário citar $@corretamente, ou seus argumentos serão passados ​​após a divisão de palavras (incorreta).
Chris Baixo
2

Ou você pode usar execpara substituir seu processo de shell sshao pular para outro host:

SSH to host1 with PuTTY...
banjer@host1:~> #...doin some work...ooh! need to go check something on host8...
banjer@host1:~> exec ssh host8
banjer@host8:~> #...doin some work...OK time for lunch. lets close putty...
banjer@host8:~> exit
Putty closes.

5 níveis de profundidade não são bonitos, pois o tráfego passará por todos os outros servidores. Por isso, não recomendo apenas matar o PuTTY ou o ssh (~.), Pois (dependendo do que você faz) isso pode resultar em processos órfãos nos servidores.

Melhor tentar e ser menos "preguiçoso". Clique com o botão direito do mouse na barra de título de massas e agiliza a abertura de uma nova sessão. Se você possui um servidor "padrão" e aceita 1 salto, o recurso "Sessão duplicada" é muito útil. Especialmente ao usar a autenticação pubkey.

MattBianco
fonte
2

Se você não se importa em criar um pouco de script, pode fazer isso.

Script: myssh.sh

#!/bin/bash
ssh $1
if [ $? -eq 5 ]; then
 exit 5
fi

Ligue através do comando dot:

$ . myssh [email protected]

Se você deseja sair de um nível:

$ exit

Se você deseja sair de todos:

$ exit 5
Moonthief
fonte
Claro, você teria que copiá-lo para todos os computadores dos quais possa usar o SSH. Além disso, não seria mais fácil definir apenas uma função shell chamada ssh? Isso evitaria o período precedente, etc.
etherfish
-1

Digitar logout na janela do terminal do putty faz isso por mim:

richard@forevermore:~ > logout

Fecha a conexão ssh e fecha o aplicativo Putty.

Richard
fonte
Acredito que você não leu a pergunta corretamente. OP faz ssh host1e, a partir de host1, faz ssh host8. Nesse ponto, a logoutfaria o mesmo que o exitcomando que eles já conhecem - saia host8e coloque-os novamente host1.
G-Man diz 'Reinstate Monica'
Ok, entendo, meu mal.
Richard