Як я можу вирватися з 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.