выход из всех соединений SSH в одной команде и близком PuTTY

После маленького обсуждения Usenet я использую следующее в качестве обходного решения для flock -n lockfile -c command:

#! /bin/bash

if [ $# != 4 -o "$1" = '-h' ] ; then
   echo "Usage: flock -n lockfile -c command" >&2
   exit 1
fi

lockfile=$2
command=$4

set -o noclobber
if 2>/dev/null : > "$lockfile" ; then
   trap 'rm -f "$lockfile"' EXIT
   $BASH -c "$command"
else
   exit 1
fi

19
26.06.2012, 19:42
6 ответов

Попытайтесь использовать ssh escape-последовательность завершения соединения.

В 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).
29
27.01.2020, 19:44
  • 1
    Довольно прохладный! Любой способ поместить ~. в псевдоним или функцию? Только дать ему легкое для запоминания имени как exitall. Теперь я прошу слишком очень :). Я попробовал несколько вещей в ~/.bashrc но доберитесь -bash: ~.: command not found. Я предполагаю, что удар рассматривает его как строку и не escape-последовательность, прибывающую непосредственно из клавиатуры. –  Banjer 26.06.2012, 20:36
  • 2
    мне нравится ctrl+d решение также, но это отвечает на мой вопрос более непосредственно. Спасибо все. –  Banjer 26.06.2012, 21:51
  • 3
    @Banjer никогда не видит ~., это обрабатывается ssh самостоятельно. –  Gilles 'SO- stop being evil' 27.06.2012, 01:21
  • 4
    @Gilles, имеет смысл. –  Banjer 27.06.2012, 23:52
  • 5
    И нет никакой гарантии, что PuTTY также делает это. CLI ssh клиенту нужна эта техника, потому что это - CLI. PuTTY является приложением GUI и существуют намного более удобные для пользователя способы сделать этот материал на GUI. –  Alexios 30.06.2012, 16:45

Просто нажмите CtrlD, и он зарегистрирует Вас там для хранения ctrl и нажмет "d", пока окно не исчезнет.

12
27.01.2020, 19:44
  • 1
    К сожалению, это не работает универсально. Любая сессия, выполняющая редактора или другой полноэкранный инструмент, вероятно, проигнорирует EOT. И даже bash проигнорирует его посреди командной строки. Попробуйте его сами: введите одну букву и попытку Ctrl-D. –  Alexios 30.06.2012, 15:49
  • 2
    То, что делает Ctrl + D, делает, я имею в виду, это, безопасно существует или просто уничтожает процесс? –  AMB 06.08.2015, 05:23
  • 3
    Это безопасно выходит. Это - ярлык оболочки, который совпадает с вводом 'выход' и нажатием Enter. –  Joe 07.08.2015, 15:54
  • 4
    Actually (удар мерзавца окон и удар человечности) проблема a logout. –  velis 21.12.2016, 14:19
  • 5
    да, я полагаю, что выход также называет выход из системы, поскольку соединения SSH имеют тенденцию не быть сессиями входа в систему. –  Joe 01.01.2017, 03:19

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

9
27.01.2020, 19:44

Иначе должен сделать function для ssh:

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

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

Обратите внимание на то, что Вы должны сделать такую функцию во всех своих серверах, иначе этот взлом не будет работать. Btw можно всегда помещать функцию в ~/.bashrc или ~/.whatever_shell_you_use_rc.

Это смотрит немного грязный взлом по сравнению с путем uther.

2
27.01.2020, 19:44
  • 1
    function не POSIX - просто удаляют ключевое слово, и необходимо заключить в кавычки $@ правильно, или Ваши аргументы будут переданы после слова, разделяющего (плохо). –  Chris Down 03.11.2012, 00:15

Или Вы могли использовать 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 (~)., с тех пор (в зависимости от того, что Вы делаете) это могло привести к осиротевшим процессам на серверах.

Лучше попытаться быть менее "ленивым". Щелкните правой кнопкой по строке заголовка шпаклевок, делает открытие новой сессии быстрым. Если Вы имеете сервер "по умолчанию" и принимаете 1, спрыгивают с этого, функция "Duplicate Session" очень полезна. Особенно при использовании pubkey аутентификации.

2
27.01.2020, 19:44

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

Сценарий: myssh.sh

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

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

$ . myssh user@server.com

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

$ exit

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

$ exit 5
2
27.01.2020, 19:44
  • 1
    Конечно, у Вас была бы копия им к каждому компьютеру, от которого Вы можете когда-либо ssh. Кроме того, разве не было бы легче просто определить функцию оболочки, вызванную ssh? Это избежало бы предыдущего периода и т.д. –  etherfish 03.08.2014, 22:08

Теги

Похожие вопросы