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

318

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

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

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

    
задан Wayne Werner 11.03.2011 в 16:22
источник

3 ответа

437

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

Больше этих escape-последовательностей можно указать с помощью 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 ). То есть введите ~ < kbd> ~ ~ ~ ~ . завершает сеанс ssh 5 уровней и сохраняет другие 4 неповрежденные.

    
ответ дан geekosaur 11.03.2011 в 17:18
источник
46

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

Host *
ServerAliveInterval 15

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

Против другой опции TCPKeepAlive , она проверяется в зашифрованном канале и не подделана.

Отмечается, что эти keep-alives также помогают поддерживать, длинные простоя , живые, т. е. препятствовать вам иметь полузакрытые сеансы tcp, не зависящие от времени.

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

    
ответ дан ulidtko 11.03.2011 в 18:51
37

Как отмечено в ответе гейкозавра, 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 15.03.2011 в 06:39

Ознакомьтесь с другими вопросами по меткам