Як я можу вирватися з ssh, коли він заблокується?


380

У школі я часто забиваюся до своєї скриньки, але зазвичай, коли я міняю заняття, а комп'ютер призупиняється, труба буде зламана. Однак ssh просто блокується - Ctrl+ c, Ctrl+ zі Ctrl+ dне мають ефекту.

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

Отже, моє запитання, чи є простий спосіб змусити ssh вмерти належним чином (тобто, коли труба вийде з ладу "нормально", вона вийде із повідомленням про розбиту трубу)? Або я повинен розібратися, що таке PID, і вручну його вбити?


Якщо я відключився з активним сеансом SSH, він заморожується. Я просто вбиваю це і починаю нову сесію. Інформація не втрачається, оскільки я використовую екран GNU.
— Лекенштейн

Я теж - екран найкращий. Але це все одно дратує screen -x: P
— Wayne Werner

[mosh] (mosh.mit.edu) є акуратною альтернативою, щоб уникнути цієї проблеми. Він "залишається на зв'язку" навіть при переривчастому підключенні до Інтернету.
— jaynp

@jaynp Недолік мене за допомогою mosh (ще дві хвилини тому) полягає в тому, що я не знаю, як відключити його. Я використовую tmux + irssi-сеанс на віддаленому хості (як IRC вибійник, щось на зразок), і я хочу іноді відключати з'єднання (зберігаючи tmux + irssi) і що я робив з <enter> + ~ +. за допомогою SSH, але не працюватиме mosh.
— Павло Шімерда

Відповіді:


534

Звичайні клавіші передаються протягом sshсеансу, тому жодна з них не працюватиме. Замість цього використовуйте послідовності втечі. Для того, щоб вбити поточну сесію вдарила згодом 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 залишаються неушкодженими.


48
Для розкладок клавіатури, де ~є мертвий ключ , послідовність клавіш Enter ~ Space ..
— Søren Løvborg

1
Я додав більше послідовностей евакуації, які можуть бути корисними. :)
— gertvdijk

5
Зверніть увагу , що вам потрібно розкоментувати рядок EscapeChar ~в /etc/ssh/ssh_config(або , ~/.ssh/ssh_configякщо ви віддаєте перевагу).
— Адітя МП

6
@Hitechcomputergeek Enter ~ ~ .Оскільки ~ ~надсилає літерал ~через ваш сеанс SSH, другий сеанс SSH отримає його як єдиний тильд і буде інтерпретувати .як частину втечі. Щоб відправити на 5-у вкладений сеанс ssh, просто використовуйте 5 тильдів у своїй послідовності втечі.
— Score_Under

4
життя змінюється;)
— artm

54

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

Host *
ServerAliveInterval 15
# ServerAliveCountMax 3

Це змушує ssh-клієнт надсилати параметри на рівні програми кожні 15 секунд. Кожного разу, коли три з них послідовно виходять з ладу (за замовчуванням ServerAliveCountMax), клієнт вважає з'єднання вивішеним і закриває його.

На противагу іншій опції TCPKeepAliveце перевіряється в зашифрованому каналі і не підлягає підробці.


Це час зазначено , що ті , тримати-alives також допомагають, UHM, тримати давно на холостому ходу з'єднання в живих, тобто запобігти вас від напівзакритої TCP сесій висить годинами недоторканим.

Я настійно рекомендую ввімкнути цю функцію, якщо ви регулярно стикаєтесь з цим, але ви також повинні знати про незначний ризик безпеки, який він може накласти. Відкритий текст атака може стати легше , якщо зловмисник знає інтервал і які приносить неробочий з'єднання. Це може бути причиною того, що він не включений за замовчуванням.


3
Причини безпеки. Ви можете випити і залишити ssh sessio відкритим, а ваш лабораторний партнер, з яким ви працювали протягом останніх 20 років, може використати ваш сеанс, щоб викрасти сервер і знищити його ... поки ви пили в 10-хвилинній перерві.
— Луїс Альварадо

2
@CYREX, так? І як вимкнений за замовчуванням варіант може запобігти вам нечесних лабораторних партнерів? %)
— ulidtko

1
@ulidtko: Чи є якась причина не встановити ServerAliveInterval1, щоб негайно виявити втрачене з'єднання?
— krlmlr

2
@gertvdijk: Дякую Для мене це працює навіть без Hostлінії. Крім того, "сучасні шифри, такі як Розширений стандарт шифрування, в даний час не сприйнятливі до відомих атак в простому тексті". (із посилання, яке ви додали) ...
— krlmlr

2
ви також можете замінити SSH на Mosh (мобільна оболонка). Mosh підключається до сервера через SSH, але потім встановлює канал на основі UDP, стійкий до проблем з підключенням. Mosh також має локальне відлуння, тож ви можете бачити, що ви набираєте текст, навіть якщо сервер не відповідає. Коли нажимаються клавіші, Мош позначає відлунений текст. mosh.mit.edu
— Паскаль Росін

41

Як зазначається у відповіді geekosaur, послідовність відходу ~.припинить з'єднання.

Повний список послідовностей втечі та те, що вони роблять, можна відобразити, ввівши ~?:

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.)

Як закрити список послідовностей втечі?
— Крістіанп

3
Якщо ви не надрукує список послідовностей втечі, він готовий прийняти наступний.
— Техас Кале
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.