wyjdź ze wszystkich połączeń SSH za pomocą jednego polecenia i zamknij PuTTY


19

Czy istnieje sposób na wycofanie się ze wszystkich połączeń SSH i zamknięcie PuTTY za pomocą „jednego strzału”? Pracuję w systemie Windows 7 i używam PuTTY do SSH na różnych hostach Linux.

Przykład sposobu, w jaki pracuję:

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.

Jak wyżej, jakikolwiek sposób na przejście z host8 do zamknięcia PuTTY za jednym razem? Czasami znajduję się w głębokości do 5 lub 10 hostów. Zdaję sobie sprawę, że mogę kliknąć X, aby zamknąć okno PuTTY, ale chcę się upewnić, że moje połączenia SSH są poprawnie zamykane za pomocą polecenia exit. Zdaję sobie również sprawę, że proszę o wskazówki, jak zwiększyć lenistwo. Po prostu skreślę to jako „jak mogę być bardziej wydajny”.


6
Nie bezpośrednio, o co pytasz, ale co powiesz na ctrl+dwielokrotne naciskanie ?
Ulrich Dangel

@UlrichDangel Nigdy wcześniej tego nie używałem, ale także szybki sposób szybkiego wycofania się z połączeń.
Banjer

2
Czy naprawdę zagnieżdżasz sesje ssh na głębokości od 5 do 10 poziomów? Czy zdajesz sobie sprawę, że tworzy to zwinięty tunel, który odbija wszystkie pakiety w sesji ssh przez wszystkie te hosty? Czy możesz rozwiązać problem, po prostu nie zagnieżdżając sesji ssh?
jw013,

@ jw013 Nie, nie zdawałem sobie z tego sprawy, ale ma sens. Szczerze mówiąc, 5-10 poziomów było przesadą, ale starałem się zilustrować moje pytanie „jak czysto wyjść z Putty za jednym zamachem”.
Banjer

Odpowiedzi:


29

Spróbuj użyć sshsekwencji ucieczki zakończenia połączenia.

W sshsesji wpisz ~.(kropka tyldy). Po wpisaniu nie zobaczysz znaków, ale sesja zostanie natychmiast zakończona.

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

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

Całkiem fajne! W jakiś sposób umieścić ~.w aliasie lub funkcji? Aby nadać mu łatwą do zapamiętania nazwę jak exitall. Teraz proszę o zdecydowanie za dużo :). Próbowałem kilka rzeczy, ~/.bashrcale rozumiem -bash: ~.: command not found. Przypuszczam, że bash widzi to jako ciąg znaków, a nie sekwencję ucieczki pochodzącą bezpośrednio z klawiatury.
Banjer

Podoba mi się również ctrl+drozwiązanie, ale to odpowiada bardziej bezpośrednio na moje pytanie. Dziękuje wszystkim.
Banjer

3
@Banjer bash nigdy nie widzi ~., jest obsługiwany sshsam.
Gilles „SO- przestań być zły”

@Gilles gotcha, ma sens.
Banjer

I nie ma gwarancji, że PuTTY również to zrobi. sshKlient CLI potrzebuje tej techniki, ponieważ jest to CLI. PuTTY to aplikacja GUI i istnieje wiele bardziej przyjaznych dla użytkownika sposobów robienia tego w GUI.
Alexios

12

Po prostu naciśnij, CtrlDa wyloguje cię tam, przytrzymując klawisz Ctrl, i naciśnij „d”, aż okno zniknie.


1
Niestety, to nie działa uniwersalnie. Każda sesja z edytorem lub innym narzędziem pełnoekranowym może zostać zignorowana EOT. I nawet bashzignoruje to w środku wiersza poleceń. Wypróbuj sam: wpisz jedną literę i spróbuj Ctrl-D.
Alexios

Co robi Ctrl + D, to znaczy, czy bezpiecznie istnieje, czy po prostu zabija proces?
AMB,

Bezpiecznie wychodzi. Jest to skrót powłoki, który jest taki sam, jak wpisanie „exit” i naciśnięcie Enter.
Joe,

Właściwie mój (Windows Git Bash i Ubuntu Bash) wydaje logout.
velis

tak, wierzę, że exit również wywołuje wylogowanie, ponieważ połączenia ssh zwykle nie są sesjami logowania.
Joe


2

Innym sposobem jest, aby functiondla ssh:

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

Niestety, po zakończeniu pracy w systemie zdalnym zawsze zamknie połączenie i wyloguje się z konsoli.

Pamiętaj, że musisz wykonać taką funkcję na wszystkich swoich serwerach, w przeciwnym razie ten hack nie zadziała. Btw zawsze możesz umieścić funkcję w ~ / .bashrc lub ~ / .whthing_shell_you_use_rc.

Wygląda na nieco brudny hack w porównaniu ze sposobem Uthera.


functionnie jest POSIX - po prostu usuń słowo kluczowe i musisz $@poprawnie cytować , w przeciwnym razie argumenty zostaną przekazane po podziale słów (złe).
Chris Down,

2

Lub możesz użyć execdo zastąpienia procesu powłoki sshpodczas przeskakiwania na inny 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.

Głębokość 5 poziomów nie jest ładna, ponieważ ruch będzie przechodził przez wszystkie pozostałe serwery. Z tego powodu nie polecam po prostu zabijania PuTTY lub ssh (~.), Ponieważ (w zależności od tego, co robisz) może to spowodować osierocone procesy na serwerach.

Lepiej spróbować być mniej „leniwym”. Kliknij prawym przyciskiem myszy pasek tytułu putty, aby szybko otworzyć nową sesję. Jeśli masz „domyślny” serwer i akceptujesz 1 skok z niego, funkcja „Duplicate Session” jest bardzo przydatna. Zwłaszcza podczas korzystania z uwierzytelniania klucza publicznego.


2

Jeśli nie masz nic przeciwko zrobieniu małego skryptu, możesz to zrobić.

Skrypt: myssh.sh

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

Zadzwoń za pomocą polecenia kropki:

$ . myssh user@server.com

Jeśli chcesz wyjść z jednego poziomu:

$ exit

Jeśli chcesz wyjść ze wszystkich:

$ exit 5

Oczywiście skopiowałbyś go na każdy komputer, z którego możesz kiedykolwiek ssh. Czy nie byłoby łatwiej zdefiniować funkcję powłoki o nazwie ssh?
Pozwoliłoby

-1

Wpisanie wylogowania w oknie terminalu robi to dla mnie:

richard@forevermore:~ > logout

Zamyka połączenie ssh i zamyka aplikację Putty.


Uważam, że nie przeczytałeś pytania poprawnie. OP robi ssh host1, a potem host1robi z ssh host8. W tym momencie a logoutzrobiłby to samo, co exitpolecenie, które już zna - wyjdź host8i włóż je z powrotem host1.
G-Man mówi „Przywróć Monikę”

Ok, rozumiem, moje złe.
Richard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.