Вопрос: Почему консоль иногда висит навсегда, когда происходит соединение SSH?


Я видел это со множеством консолей (на Linux, Mac, ...) и множеством разных машин во многих разных сетях. Я никогда не могу точно определить причину, почему это происходит: все, что вам нужно сделать, это войти в систему через SSH. Если соединение по какой-либо причине нарушается (для простоты предположим, что сетевой кабель был вытащен), то иногда консоль просто висит навсегда - в других случаях она просто прекращает работу с родительской оболочкой.

Это так раздражает, когда это происходит (например, вы теряете историю команд.) Может быть, есть секретная комбинация клавиш, которая может заставить выход (Ctrl-C или Ctrl-D не работают)? И в чем причина этой случайной «ошибки» во всех реализациях?


70
2018-06-22 18:12


Источник


Эта тема кажется уместным упомянуть Мош (Mobile Shell), который отлично сочетается с отказами подключения, включая роуминг (изменение IP) и другие вещи. - Ciprian Tomoiagă


Ответы:


Существует секретная комбинация клавиш для принудительного выхода: ~) От замороженной сессии нажмите эти клавиши в следующем порядке: Войти~, Тильда (только после новой строки) распознается как escape-последовательность клиентом ssh, а период говорит клиенту о прекращении бизнеса без дальнейших церемоний.

Длительное поведение по вопросам коммуникации не является ошибкой, сеанс SSH висит в надежде, что другая сторона вернется. Если сеть ломается, иногда даже через несколько дней вы можете получить сеанс SSH. Конечно, вы можете сказать ему, чтобы отказаться и умереть с помощью последовательности выше. Существуют также различные вещи, которые вы можете сделать, например, установить тайм-ауты keep-alive в своем клиенте, чтобы, если у него нет активной ссылки в течение определенного времени, она отключается самостоятельно, но поведение по умолчанию заключается в том, чтобы оставаться как как можно!

Редактировать: Другим полезным приложением этого ключа прерывания является привлечение внимания местного клиента ssh и его восстановление, чтобы вернуться в свою локальную оболочку на минуту - чтобы получить что-то из своей истории, - затем направить его на работу, чтобы продолжать работать удаленно. Войти~  Ctrl+Z для отправки ssh-клиента в очередь фонового задания вашей локальной оболочки, затем fg как обычно, чтобы вернуть его.


113
2018-06-22 18:15



+1 за то, что он знал пароль додекатупа-секретного пробации для съемки sshd в голове. Вы узнали об этом так же, как и я (опечатка ~/.somethingorother после входа в игру)? - voretaq7
@ voretaq7: Нет, я не был таким умным, но когда кто-то понял меня, я пошел «Действительно? Так вот что происходит все эти времена, когда моя оболочка просто пошла БАНГ! Без причины, когда я печатал?», Это не обычная последовательность, за исключением тех, которые вы упоминаете, но это может произойти. - Caleb
При этом «секретный» он означает «на странице руководства». - larsks
Хотя многие люди не знают об этом, это действительно секрет в простом виде. man ssh охватывает это под ESCAPE CHARACTERS раздел. ~. (Отключить) и ~^Z (background ssh) очень удобны. - Stefan Lasiewski
Конечно, это на странице руководства :) Я использовал слово «секрет», потому что это сделал OP, и я использовал язык в щеку. Проблема с этой особенностью в том, что люди не знают, где ее искать, они ожидают, что управляющие символы и такие сигналы будут частью оболочки или таковой. Как только вы знаете, где искать или даже спрашивать, конечно, он есть. - Caleb


SSH предлагает средство поддержания работоспособности. Добавьте следующее в свой местный ~/.ssh/config (создайте, если он не существует):

ServerAliveInterval 15
ServerAliveCount 3

Эта настройка будет устанавливать сигнал keep-alive, отправляемый каждые 15 секунд через защищенный туннель. После трех последовательных сбоев клиент SSH выйдет.

Обратите внимание, что в некоторых системах это должно быть:

ServerAliveInterval 15
ServerAliveCountMax 3

Взято из этого ответа на ask.ubuntu: https://askubuntu.com/a/29967/30266


9
2018-01-19 08:44





Тот факт, что он зависает, является функцией TCP, а не SSH. Приложение не имеет никакого представления о том, что сеанс TCP / соединение был отключен, если TCP не сообщает приложение, используя соединение, которое соединение больше не существует. С точки зрения каждого хоста, сеанс TCP все еще находится в состоянии «Установлено», и нет ничего, что можно сказать, что длительный сеанс бездействия (без потока данных) недействителен, кроме RST или отсутствие ответа на пакет keepalive TCP (который не реализуется повсеместно). Это не похоже на ошибку в SSH для меня, я бы ожидал такого поведения.


8
2018-06-22 19:49





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

Хотя это на самом деле не отвечает на вопрос, это может помочь уменьшить влияние зависания соединения: когда я работаю удаленно (и даже обычно, когда это не так), я просматриваю screen (с или без byobu обертка в зависимости от ее доступности), так что если произойдет какое-либо соединение, мой сеанс, со всей его историей, сохраняется и доступен в состоянии, которое я оставил при повторном подключении.


5
2018-06-22 18:18



Ваше предположение о экране в порядке, но первый бит на самом деле не применим к проблеме. Вам не нужно вводить ключи на удаленную сторону, вам нужно только передать их LOCAL ssh-клиенту! OP хочет вернуть свою локальную оболочку, включая историю. SSH берет его и не реагирует на обычные последовательности прерываний, такие как CTRL-C, потому что он передает их. Есть способ пройти и прекратить локальный клиент, см. Мой ответ. История на локальном конце обычно сохраняется в любом случае, если вы снова входите в систему, в зависимости от конфигурации оболочки. - Caleb
@Caleb: в вопросе конкретно упоминается потеря истории, а история команд хранится на стороне сервера. Чтобы сообщить серверу сделать что-то другое с историей, вам нужно получить сообщение на сервер, чтобы сообщить ему сделать что-то другое с историей. Конечно, есть способы заставить bash (и некоторые другие оболочки) записывать строки истории непосредственно, а не собирать их в ОЗУ до тех пор, пока пользователь не найдет оболочку с exit/logout которые могли бы решить проблему истории без использования screen, - David Spillett