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

380

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

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

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

Уэйн Вернер
источник
Если я отключился от активного сеанса SSH, он зависает. Я просто убиваю это и начинаю новый сеанс. Информация не теряется, потому что я использую экран GNU.
Лекенштейн
Я тоже - экран лучший. Но все равно раздражает необходимость screen -x: P
Уэйн Вернер
[mosh] (mosh.mit.edu) - хорошая альтернатива, чтобы избежать этой проблемы. Он «остается на связи» даже при прерывистой интернет-связи.
Jaynp
@jaynp Недостаток использования mosh (так как две минуты назад) состоит в том, что я не знаю, как его отключить. Я использую сеанс tmux + irssi на удаленном хосте (в качестве перехватчика IRC, вроде того), и я действительно хочу иногда отключаться (сохраняя запущенный tmux + irssi), и это я сделал с помощью <enter> + ~ +. используя SSH, но не будет работать с mosh.
Павел Шимерда

Ответы:

535

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

Больше эти управляющие последовательности могут быть перечислены с Enter ↵, ~, ?:

Supported escape sequences:
  ~.  - 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
(Note that escapes are only recognized immediately after newline.)

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

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

geekosaur
источник
48
Для раскладки клавиатуры , где ~представляет собой мертвый ключ , ключ последовательности Enter ~ Space ..
Сёрен Левборг
1
Я добавил больше escape-последовательностей, которые могут быть полезны. :)
gertvdijk
5
Обратите внимание , что вам нужно раскомментировать строку EscapeChar ~в /etc/ssh/ssh_config(или , ~/.ssh/ssh_configесли вы предпочитаете).
Адитья депутат
6
@Hitechcomputergeek Enter ~ ~ .Так как ~ ~отправляет литерал ~через ваш сеанс SSH, второй сеанс SSH получит его как одну тильду и будет интерпретировать .как часть escape. Чтобы отправить на 5-й вложенный сеанс SSH, просто используйте 5 тильд в своей escape-последовательности.
Score_Under
4
жизнь меняется;)
artm
54

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

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

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

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


Это время отмечено , что те , держать-alives также помогают, UHM, держать давно на холостом ходу соединения в живых, то есть предотвратить вас от полузакрытой TCP сессий висит часами нетронутым.

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

ulidtko
источник
3
Причины безопасности. Вы можете пойти выпить и оставить ssh sessio открытым, и ваш партнер по лаборатории, с которым вы работали в течение последних 20 лет, может использовать вашу сессию для взлома сервера и его уничтожения ... пока вы пили в свой 10-минутный перерыв.
Луис Альварадо
2
@CYREX, а? И как отключить параметр по умолчанию, чтобы предотвратить появление недобросовестных лабораторных партнеров? %)
ulidtko
1
@ulidtko: Есть ли причина, по которой вы не установили ServerAliveIntervalзначение 1, чтобы немедленно обнаружить потерянное соединение?
krlmlr
2
@gertvdijk: Спасибо. Для меня это работает даже без Hostлинии. Кроме того, «Современные шифры, такие как Advanced Encryption Standard, в настоящее время не подвержены атакам с открытым текстом». (по добавленной вами ссылке) ...
krlmlr
2
Вы также можете заменить SSH Mosh (мобильная оболочка). Mosh подключается к серверу через SSH, но затем устанавливает канал на основе UDP, который устойчив к проблемам с подключением. Mosh также имеет локальное эхо, поэтому вы можете видеть, что вы печатаете, даже если сервер не отвечает. Когда клавиши доставлены, Мош отмечает отмеченный текст. mosh.mit.edu
Паскаль Розин
41

Как отмечено в ответе геекозавра, 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.)
scottl
источник
Как мне закрыть список escape-последовательностей?
Кристианп
3
Вы не можете, после того как он напечатает список escape-последовательности, он готов принять следующий.
Техас Кале