Я часто подключаюсь к своему ящику дома из школы по 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

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