Выход из SSH-соединения с пользователем, переключившимся внутри за один шаг

Мне просто интересно об этом. Иногда я использую SSH как ssh ubuntu@example.com а затем запускаю sudo -i для входа в систему от имени пользователя root .

Теперь я хочу отключиться и вернуться к исходному хосту. Я обычно ввожу команду exit или сочетание клавиш Ctrl + D дважды, чтобы вернуться назад.

Мне интересно, возможно ли сделать это за один шаг, независимо от того, сколько раз вы использовали sudo в удаленном соединении?

Вам нужно знать rlogin .

SSH имеет семантику старых программ BSD rlogin и rsh . Руководство OpenSSH не документирует эту семантику, так как они были задокументированы в старых руководствах rlogin и rsh коммерческих Unices. Одна часть этой семантики – это escape-последовательности, которые существуют в интерактивном сеансе rlogin .

Escape-последовательности начинаются с escape-символа , за которым следует другой символ, определяющий фактическую последовательность. Они принимаются локальным клиентским концом соединения SSH. Чтобы в большинстве случаев удаленный конец мог использовать прозрачный символ перехода, он распознается только сразу после ввода новой строки. Кроме того, дублирующий экранирующий символ – это экранирующая последовательность, которая отображается для отправки одного escape-символа на удаленный конец, так что можно по-прежнему отправлять escape-символ сразу после новой строки, если это необходимо. (Это пример обычного Blast! Я думал, что нажал эту кнопку. Нажмите ее еще раз. Семантика пользовательского интерфейса. ☺)

Последовательность побега, представляющая особую важность для вас, – это символ побега, за которым следует . Стоп. Это отключает соединение SSH от локального конца.

Важное упущение в руководстве OpenSSH, которое можно найти в старом dloo rlogin , заключается в том, что если у вас есть цепочка соединений, можно использовать механизм удвоения, чтобы гарантировать, что escape-последовательность обрабатывается любым последующим SSH-клиентом в цепь нужно.

Так (например) на хосте A, если кто-то использовал SSH для входа на хост B, а затем оттуда использовал SSH для входа на хост C, можно выполнить локальное отключение на соединении B → C, оставив A → B соединение не повреждено, набрав (сразу после новой строки) escape-символ дважды, а затем . , Соединение A → B декодирует это как один управляющий символ, который должен быть отправлен, а затем . который соединение B → C, в свою очередь, видит как escape-последовательность, командующую локально инициируемым разъединением. Это можно расширить очевидным логическим способом.

Сам символ выхода по умолчанию является тильдой, ~ , хотя, как говорит доко, это можно изменить двумя способами. Обратите внимание, что для того, чтобы напечатать это на раскладках клавиатуры, которые имеют мертвые клавиши, необходимо следовать за клавишей ~ (которая сама по себе может быть аккордом, требующей клавиш модификации, в зависимости от раскладки клавиатуры) через пробел, чтобы локальный клиент SSH даже сначала видит тильду в интерактивном вводе с терминала. Таким образом, ввод escape-последовательности разъединения (после новой строки) будет ~ . и локальное отключение для одного перехода также будет ~ ~ . ,

дальнейшее чтение

  • «Побег последовательности» . rlogin . Руководство пользователя HP-UX 11i, версия 2. Hewlett-Packard. Август 2003 г.
  • Msgstr “Прервать соединение rlogin ” . Руководство пользователя Solaris Advanced . 806-7612-11. Sun Microsystems. 2002.
  • Даниэль Барретт, Ричард Сильверман и Роберт Бирнс (2005). “Расширенное использование клиента: Escape”. SSH, Secure Shell: полное руководство . ISBN 9780596008956. O’Reilly Media. с. 299–302.

Вы должны быть в состоянии сделать это, используя ~ + . комбинация клавиш. Это должно полностью завершить сеанс ssh, независимо от того, сколько разных пользовательских сеансов у вас в нем.

Если вы используете jumphosts и / или терминальные серверы для доступа к вашему серверу, вам нужно добавить ~ в последовательность. Таким образом, если вы подключитесь по SSH к серверу, прежде чем войти в систему на сервере, последовательность отключений от сервера будет ~ + ~ + . , В старом стиле telnet и последовательные соединения также есть эта опция escape. С помощью ssh -e @ user@server.example.org управляющий символ изменяется с ~ (по умолчанию) на @ для этого соединения.

Ответ, вероятно, нет.

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

Подсказка клавиши переключения, упомянутая Jesse_b, хороша, но имеет вышеупомянутый откат

Если вы заранее знаете, что не хотите нажимать Ctrl-D дважды, вы можете вызвать:

  exec sudo -i 

Но у этого все еще есть некоторый недостаток, упомянутый выше.

Ctrl-D дважды определенно единственная лучшая практика, о которой я могу думать