Как я могу выйти из ssh, когда он блокируется?

Я часто подключаюсь к своему ящику дома из школы по ssh, но обычно, когда я меняю занятия и мой компьютер зависает, канал прерывается. Однако ssh просто блокирует - Ctrl+c, Ctrl+z и Ctrl+d не имеют никакого эффекта.

Раздражает необходимость перезагрузки моего терминала, и еще больше раздражает необходимость закрывать и заново создавать новое окно экрана.

Итак, мой вопрос: есть ли простой способ заставить ssh работать должным образом (т.Е. Когда канал выходит из строя "нормально", он завершается с сообщением о сломанном канале)? Или я должен выяснить, что такое PID, и вручную отключить его?

Обычные ключи пересылаются по ssh сеанс, так что ни один из них не сработает. Вместо этого используйте escape-последовательности. Чтобы завершить текущую сессию, нажмите "Впоследствии" Enter, ~, ..

(Имейте в виду, что в международных клавиатурах, где ~ установлен как составляющий персонаж, вы должны нажать на него дважды: Enter, ~, ~, .)

Другие из этих escape-последовательностей могут быть перечислены с помощью Enter, ~, ?:

Supported escape sequences:     ~.   - terminate connection (and any multiplexed sessions)     ~B   - send a BREAK to the remote system     ~C   - open a command line     ~R   - request rekey     ~V/v - decrease/increase verbosity (LogLevel)     ~^Z  - suspend ssh     ~#   - list forwarded connections     ~&   - background ssh (when waiting for connections to terminate)     ~?   - this message     ~~   - send the escape character by typing it twice(Note that escapes are only recognized immediately after newline.)

Вы можете закрыть список Escape-последовательностей, нажав Enter.

Обратите внимание, что, потому что ударяя ~~ причины ssh чтобы отправить ~ вместо того, чтобы перехватывать его, вы можете обратиться N вложенный ssh соединения, нажав ~ N раз. (Это относится только к ~s, которые непосредственно следуют за Enter.) То есть это означает, что Enter~~~~~. завершает ssh сеанс на 5 слоев глубже и сохраняет остальные 4 нетронутыми.

Вы также можете захотеть настроить уровень приложения сохраняйте жизнь для SSH для предотвращать это от зависания из-за проблем с подключением. Мой ~/.ssh/config содержит это:

Host *ServerAliveInterval 15# ServerAliveCountMax 3

Это заставляет ssh-клиент отправлять обновления на уровне приложения каждые 15 секунд. Всякий раз, когда три из них последовательно выходят из строя (по умолчанию ServerAliveCountMax), клиент считает соединение зависшим и закрывает его.

В отличие от другого варианта TCPKeepAlive, это проверяется в зашифрованном канале и не поддается подделке.


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

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

Как отмечено в ответе geekosaur, escape-последовательность ~. завершит соединение.

Полный список escape-последовательностей и то, что они делают, можно отобразить, набрав ~?:

Supported escape sequences:  ~.  - terminate connection (and any multiplexed sessions)  ~B  - send a BREAK to the remote system  ~C  - open a command line  ~R  - Request rekey (SSH protocol 2 only)  ~^Z - suspend ssh  ~#  - list forwarded connections  ~&  - background ssh (when waiting for connections to terminate)  ~?  - this message  ~~  - send the escape character by typing it twice(Note that escapes are only recognized immediately after newline.)

Если я отключился от активного сеанса SSH, он зависает. Я просто убиваю его и начинаю новую сессию. Никакая информация не теряется, потому что я использую GNU screen.

мош - это отличная альтернатива, позволяющая избежать этой проблемы. Он “остается на связи” даже при прерывистом подключении к Интернету.

Я тоже - экран самый лучший. Но все равно раздражает необходимость screen -x :stuck_out_tongue:

@jaynp Недостаток того, что я использую mosh (с двух минут назад), заключается в том, что я не знаю, как его отключить. Я использую сеанс tmux + irssi на удаленном хосте (вроде как вышибала IRC), и я иногда хочу отключаться (сохраняя при этом tmux + irssi запущенным), что я и сделал с помощью + ~ +. используя SSH, но не будет работать с использованием mosh.