выйдите из всех SSH-соединений одной командой и закройте PuTTY

19

Есть ли способ отменить все соединения SSH и закрыть PuTTY «одним выстрелом»? Я работаю в Windows 7 и использую PuTTY для SSH на различных хостах Linux.

Пример того, как я работаю:

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.

Как указано выше, есть ли способ добраться от host8 до закрытия PuTTY за один раз? Иногда я нахожусь на глубине до 5 или 10 хостов. Я понимаю, что могу щелкнуть X, чтобы закрыть окно PuTTY, но я хочу убедиться, что мои SSH-соединения закрыты должным образом с помощью команды выхода. Я также понимаю, что прошу советы о том, как увеличить лень. Я просто спишу это как «как я могу быть более эффективным».

Banjer
источник
6
Не прямо то, что вы спрашиваете, а как насчет того, чтобы просто нажать ctrl+dнесколько раз?
Ульрих Дангел
@UlrichDangel Я никогда не использовал это раньше, но также и быстрый способ быстро выйти из соединения.
Banjer
2
Вы действительно вкладываете ssh-сессии глубиной от 5 до 10 уровней? Вы понимаете, что это создает извилистый туннель, который перенаправляет все пакеты в вашем сеансе SSH через все эти хосты? Не могли бы вы решить проблему, просто не вкладывая ssh-сессии?
jw013
@ jw013 Нет, я этого не осознавал, но имеет смысл. Честно говоря, 5-10 уровней было преувеличением, но я пытался проиллюстрировать мой вопрос о том, «как без труда выйти из Замазки одним махом».
Banjer

Ответы:

29

Попробуйте использовать sshescape-последовательность завершения соединения.

В sshсеансе введите ~.(тильда точка). Вы не увидите символы при их вводе, но сеанс немедленно прекратится.

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

Из 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).
Джордж М
источник
Довольно круто! Любой способ поместить ~.в псевдоним или функцию? Просто чтобы дать ему легко запомнить имя как exitall. Теперь я прошу слишком много :). Я попробовал несколько вещей, ~/.bashrcно получить -bash: ~.: command not found. Я полагаю, что bash воспринимает это как строку, а не как escape-последовательность, исходящую непосредственно с клавиатуры.
Banjer
Мне тоже нравится ctrl+dрешение, но оно отвечает на мой вопрос более прямо. Спасибо всем.
Banjer
3
@Banjer Bash никогда не видит ~., он обрабатывается sshсам по себе.
Жиль "ТАК ... перестать быть злым"
@ Жиль Гоча, имеет смысл.
Banjer
И нет никакой гарантии, что PuTTY также сделает это. sshКлиент CLI нуждается в этой технике, потому что это CLI. PuTTY - это приложение с графическим интерфейсом, и есть гораздо более удобные способы сделать это с помощью графического интерфейса.
Алексиос
12

Просто нажмите, CtrlDи он зарегистрирует вас там для удержания Ctrl и нажимайте «d», пока окно не исчезнет.

Джо
источник
1
К сожалению, это не работает универсально. Любая сессия, на которой запущен редактор или другой полноэкранный инструмент, скорее всего будет проигнорирована EOT. И даже bashпроигнорирует это в середине командной строки. Попробуйте сами: наберите одну букву и попробуйте Ctrl-D.
Алексиос
Что делает Ctrl + D, я имею в виду, безопасно ли оно существует или просто убивает процесс?
AMB
Это благополучно выходит. Это ярлык оболочки, который аналогичен вводу команды exit и нажатию клавиши ввода.
Джо
На самом деле моя (windows git bash & ubuntu bash) выдает a logout.
Велис
да, я считаю, что выход также вызывает выход из системы, так как ssh-соединения обычно не являются сеансами входа.
Джо
9

Просто закройте PuTTY. ( Alt+ F4по умолчанию IIRC.)

Жиль "ТАК - прекрати быть злым"
источник
2

Другой способ сделать functionдля ssh:

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

К сожалению, он также всегда будет закрывать соединение и выходить из консоли после завершения работы в удаленной системе.

Обратите внимание, что вам нужно сделать такую ​​функцию на всех ваших серверах, иначе этот хак не сработает. Кстати, вы всегда можете поместить функцию в ~ / .bashrc или ~ / .whwhat_shell_you_use_rc.

Это выглядит немного грязно, по сравнению с Утером.

порыв
источник
functionэто не POSIX - просто удалите ключевое слово, и вам нужно $@правильно заключить в кавычки , иначе ваши аргументы будут переданы после разбиения слова (плохо).
Крис Даун
2

Или вы можете использовать execдля замены процесса оболочки sshпри переходе на другой хост:

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 уровней - это не красиво, так как трафик будет проходить через все остальные серверы. Из-за этого я не рекомендую просто убивать PuTTY или ssh (~.), Поскольку (в зависимости от того, что вы делаете) это может привести к потерянным процессам на серверах.

Лучше попробовать и быть менее "ленивым". Щелчок правой кнопкой мыши на строке заголовка puttys позволяет быстро открыть новый сеанс. Если у вас есть сервер по умолчанию и вы принимаете 1 прыжок, функция «Дублировать сеанс» очень полезна. Особенно при использовании аутентификации pubkey.

MattBianco
источник
2

Если вы не против сделать небольшой сценарий, вы можете сделать это.

Скрипт: myssh.sh

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

Звоните через команду точка:

$ . myssh user@server.com

Если вы хотите выйти из одного уровня:

$ exit

Если вы хотите выйти из всех:

$ exit 5
Moonthief
источник
Конечно, вам нужно будет скопировать его на каждый компьютер, с которого вы можете когда-либо использовать ssh. Кроме того, не проще ли определить функцию оболочки с именем ssh? Это позволило бы избежать предыдущего периода и т. Д.
эфирная рыба
-1

Выйти из системы в окне терминала замазки:

richard@forevermore:~ > logout

Закрывает соединение ssh и закрывает приложение Putty.

Ричард
источник
Я считаю, что вы не правильно прочитали вопрос. ОП делает ssh host1, а потом, из host1, делает ssh host8. В этот момент logoutкоманда a будет делать то же самое, что и exitкоманда, которую они уже знают, - выйти из нее host8и вернуть их обратно host1.
G-Man говорит «Восстановить Монику»
Хорошо, я вижу, мой плохой.
Ричард