Как мне выйти из SSH-соединения?


239

Я подключаюсь к серверу через SSH, чтобы отправить сообщение серверу сокетов с помощью команды вроде:

SSH 181.169.1.2 -p 5566

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

Есть ли команда или комбинация клавиш, которая позволяет мне вернуться в командный режим?

Ответы:


144

Как мне выйти из SSH-соединения?

Два пути:

  • закрытие сеанса оболочки, например, с exitпоследующим Enter, или Ctrl- dобычно позволяет вам sshнормально выйти из сеанса,
  • в случае, если у вас плохое соединение и оболочка не отвечает, нажмите Enterклавишу, затем введите ~.и ssh должен немедленно закрыться и вернуть вас в командную строку.

Первый вариант должен быть интуитивно понятным, но как мы узнаем последний вариант?

Мы могли бы узнать эту информацию из внимательного прочтения справочной страницы.

$ man ssh

дает нам документацию по SSH , в которой есть следующий раздел о escape-символах:

ESCAPE CHARACTERS
     When a pseudo-terminal has been requested, ssh supports a number of
     functions through the use of an escape character.

     A single tilde character can be sent as ~~ or by following the tilde by
     a character other than those described below.  The escape character
     must always follow a newline to be interpreted as special.  The escape
     character can be changed in configuration files using the EscapeChar
     configuration directive or on the command line by the -e option.

     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 if the peer sup‐
             ports 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 port-forwardings with
             -KL[bind_address:]port for local, -KR[bind_address:]port for
             remote and -KD[bind_address:]port for dynamic port-forwardings.
             !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 if the peer
             supports it).

     ~V      Decrease the verbosity (LogLevel) when errors are being written
             to stderr.

     ~v      Increase the verbosity (LogLevel) when errors are being written
             to stderr.

Я не нахожу раздел «откуда мы это знаем» особенно полезным, потому что для меня это означает, что есть какое-то очевидное решение, когда я не нахожу это особенно интуитивным, чем я бы »man ssh "чтобы найти, как отключить. Как бы я нашел «выход», например? Я согласен, что хорошо, если вы можете подтвердить справочные страницы.
Александр Притчард

@AlexanderPritchard Я обновил свой ответ, чтобы более подробно объяснить, что мы здесь делаем. Если вам трудно понять справочную страницу, сообщить о проблеме специалисту по сопровождению или, что еще лучше, отправьте запрос на извлечение с (безусловно, хорошим) улучшением.
Аарон Холл

1
Это хорошо звучит в теории, но на практике многие люди пытаются понять, как перемещаться по этим командам, потому что даже знание того, как искать нужную информацию, предполагает контекст, которого у людей нет. Регистрация проблемы с сопровождающими и отправка запросов на извлечение с улучшениями выходит за рамки этого. Я не утверждаю, что справочные страницы являются полезными, но если бы они были настолько полезны, насколько это кажется некоторым, я бы не использовал Stack Exchange. Я хочу быть ясным, я думаю, что ваш ответ в порядке, и что люди должны проверять справочные страницы, но они не являются всесторонне полезными.
Александр Притчард

6
«Если бы они были настолько полезны, насколько это кажется некоторым, я бы не использовал Stack Exchange». Я согласен, и именно поэтому я стараюсь писать хорошие ответы. Цитирование и цитирование справочных источников не означает, что кто-то чувствует себя глупым или плохим из-за того, что они еще не читали из этого источника, это делается для того, чтобы предоставить дополнительные доказательства того, что в противном случае могло бы быть доказуемым подтверждением факта, а также информировать пользователя, где больше соответствующая информация может быть сохранена. Вы хотите знать, что вы делаете семантически правильные вещи, а также знать, что это работает.
Аарон Холл,

276

Краткий ответ: Тип exit

Если это не сработает, однако ...

Escape-символ SSH и последовательность отключения

В большинстве реализаций SSH для интерактивных сессий используется escape-символ, аналогичный Ctrl-]комбинации telnet . Экранирующий символ SSH по умолчанию ~вводится в начале строки.

Если вы хотите прекратить интерактивный сеанс OpenSSH, который застрял и не может быть завершен путем входа exitили CtrlDв оболочку на удаленной стороне , вы можете ввести, ~за которым следует точка .. Чтобы быть уверенным, что необходимо вводить escape-символ в начале строки ввода, сначала нужно нажать Enter. Таким образом, следующая последовательность завершит сеанс SSH в большинстве случаев:

Enter~.

Другие последовательности побега

Например, OpenSSH предлагает другие escape-последовательности ~.. Вход ~?во время сеанса должен дать вам список. Некоторые примеры:

  • ~затем Ctrl-Zприостанавливает сессию,
  • ~& помещает это непосредственно в фон,
  • ~# дает список переадресованных соединений в этом сеансе.
  • Если вы хотите , чтобы просто ввести тильду в начале строки, вы должны удвоить его: ~~.

Экранирующий символ можно изменить с помощью параметра командной строки -e. Если вы установите специальное значение -e none, экранирование будет отключено, и сеанс будет полностью прозрачным.

Смотрите также справочную страницу OpenBSD по ssh (на которую ссылается www.openssh.org ) под -eопцией командной строки


2
Зачем делать это простым, если вы можете сделать это бесполезно сложным?
MariusMatutiae

7
@MariusMatutiae ОП запросил случай, когда не было никакой удаленной оболочки для входа exitили Ctrl-D, но только процесс прослушивания. Я четко заявил, что мое решение подходит для сессии, которая застряла и не может быть завершена . Я попытался уточнить это больше, надеюсь, это легче увидеть сейчас.
Дабу

5
Я был настроен скептически, но ~.без пробелов было именно то, что мне было нужно, спасибо! :)
Джейми

2
В раскладке швейцарской немецкой клавиатуры тильда генерируется нажатием AltGr + ^ (плюс это блокирующая клавиша). Из-за этого кажется, что escape-последовательность не работает. Кто-нибудь знает, как набрать escape по умолчанию на швейцарском немецком?
Даниэль Олдер

4
@Dobu нашел причину, почему это не сработало раньше. Если вы уже набрали ~ в той же строке (что легко происходит, если вы тестируете), выполните следующее ~. последовательности игнорируются. Пришлось сначала нажать return ...
Даниэль Олдер

33

Вы хотите выйти из оболочки SSH?

Вы можете напечатать exitи нажать Enter, или использовать Ctrl+D


1
«Выход» помог мне, так как Ctrl + D не работал в средстве просмотра VNC ... спасибо
Радж Гупта

1
Это не работает в тех случаях, когда машина зависла или исчезла, или приложение не отвечает ни на какой ввод
Даниэль Алдер

12

Просто введите exitили logout(затем нажмите Enter, конечно) оба будут работать.


4

Вы можете написать logoutв строке консоли (и, Enterконечно, хит ).


4

Это поддерживаемые символы, которые предоставляют различные опции, с которыми вы можете поэкспериментировать с ssh.

Поддерживаемые escape-последовательности:

 ~.  - terminate session

 ~B  - send a BREAK to the remote system

 ~R  - Request rekey (SSH protocol 2 only)

 ~#  - list forwarded connections

 ~?  - this message

 ~~  - send the escape character by typing it twice

(Обратите внимание, что экранирования распознаются только сразу после новой строки.) Вы можете закрыть список последовательностей Escape, нажав Enter.


2

MacOS : когда ssh зависает, используйте следующую последовательность:

ENTER 
SHIFT+`
.

где: shift + ` производит ~ (символ тильды)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.