Есть ли способ подключиться к сеансу ssh, который был отключен? У нас проблемы с сетевым подключением к удаленному сайту, над которым мы работаем отдельно; тем не менее, в то же время мы испытываем большое количество отключений из-за потерянных пакетов при подключении к серверам в удаленном местоположении. Часто сеанс некоторое время остается активным, а иногда это происходит в середине какого-то действия (редактирование файла, запуск какого-либо процесса и т.д.), К которому мне нужно вернуться, а не перезапустить, если это возможно.
ОБНОВЛЕНИЕ: фактический ответ см. Ниже в ответе zero_r
Это не ответ, а обходной путь. Используйте экран .
При первом входе в систему запустите экран. Вы получаете другой Shell, запускаете команды в этом. Если вы отключены, экранный процесс поддерживает работу терминала, чтобы ваша консоль и процессы, на которых она работает, не перепадали. При повторном подключении запустите 'screen -r', чтобы продолжить.
Существует множество способов настройки и использования экрана, но вышеприведенное должно решить вашу проблему.
Попробуйте установить ClientAliveInterval (например, 60) и TCPKeepAlive (да или нет) в соответствующие значения на стороне сервера sshd.conf.
Это должно поддерживать ваш сеанс, даже если соединение теряется на несколько минут.
Как уже упоминалось выше, GNU Screen это путь. Это позволит вам иметь "сеанс экрана" на удаленном блоке, в котором вы можете запускать несколько команд через несколько "окон экрана". Он просто отсоединится, если ваше родительское SSH-соединение прекратит работу, и все подпроцессы, работающие в нем, будут работать нормально.
"man screen
'как обычно ваш друг, и пакет ОС должен называться' screen
', если он не установлен по умолчанию.
Основы:
Начните сеанс экрана (на вашем удаленном хосте):
$ screen
Отключиться от сеанса экрана: CTRL-A, d
Повторно подключитесь к сеансу экрана после повторного входа в систему:
$ screen -d -r
Откройте другое окно "окно": CTRL-A, c
Цикл через открытые окна экрана: CTRL-A, space
Там есть много из классных вещей, которые вы можете сделать с экрана. Я использую его более 10 лет и до сих пор выясняю новые возможности. Это моя любимая утилита Unix.
Я не могу поверить, что никто не упомянул MOSH ;
Mosh - это отдельный протокол, который может подключиться к процессу входа в SSH, он поддерживает ваш сеанс после нескольких дней отключения, смены IP-адреса, высокой задержки и так далее. Это объясняется на домашней странице лучше, чем я могу объяснить, поэтому я скопировал описание ниже. Мой опыт и советы заключаются в том, что я использую его на своем Android мобильном телефоне, это спасает жизнь во время путешествий и работы по SSH. То же самое верно и для моего ноутбука, когда он привязан к мобильному телефону в поезде, например Я рекомендую компилировать из исходного кода, чтобы получить последнюю версию, для меня в репо-версии внутри Ubuntu есть несколько неприятностей, которые исправлены в самой последней версии (на момент написания).
Мош (мобильный Shell)
Приложение для удаленного терминала, которое позволяет осуществлять роуминг, поддерживает прерывистое соединение и обеспечивает интеллектуальное локальное эхо и редактирование строк пользовательских нажатий клавиш.
Mosh - это замена SSH. Он более надежный и отзывчивый, особенно по Wi-Fi, сотовой связи и междугородной связи.
Mosh - бесплатное программное обеспечение, доступное для GNU/Linux, FreeBSD, Solaris, Mac OS X и Android.
Особенности с сайта:
Изменить IP. Оставайтесь на связи : Mosh автоматически перемещается при переходе между подключениями к Интернету. Используйте Wi-Fi в поезде, Ethernet в отеле и LTE на пляже: вы останетесь в системе). Большинство сетевых программ теряют соединения после роуминга, включая SSH и такие веб-приложения, как Gmail. Мошь отличается.
Создает сладкие сны : С помощью Mosh вы можете перевести свой ноутбук в спящий режим и разбудить его позже, сохранив соединение без изменений. Если ваше интернет-соединение обрывается, Mosh предупредит вас, но соединение возобновится, когда услуга сети вернется.
Избавьтесь от сетевых задержек : SSH ждет ответа сервера, прежде чем показывать вам свой набор текста. Это может сделать для паршивого пользовательского интерфейса. Mosh отличается: он мгновенно реагирует на ввод, удаление и редактирование строк. Он делает это адаптивно и работает даже в полноэкранных программах, таких как emacs и vim. При плохой связи недооцененные прогнозы подчеркнуты, чтобы вас не вводили в заблуждение.
Нет привилегированного кода. No daemon : вам не нужно быть суперпользователем для установки или запуска Mosh. Клиент и сервер - это исполняемые файлы, запускаемые обычным пользователем и действующие только на время существования соединения.
Тот же метод входа в систему : Mosh не прослушивает сетевые порты и не проверяет подлинность пользователей. Клиент mosh входит на сервер через SSH, и пользователи представляют те же учетные данные (например, пароль, открытый ключ), что и раньше. Затем Mosh запускает mosh-сервер удаленно и подключается к нему через UDP.
Работает внутри вашего терминала, но лучше : Mosh - программа командной строки, как ssh. Вы можете использовать его внутри xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen или tmux. Но mosh был разработан с нуля и поддерживает только один набор символов: UTF-8. Это исправляет ошибки Unicode в других терминалах и в SSH.
Control-C отлично работает : в отличие от SSH, протокол mosh на основе UDP корректно обрабатывает потери пакетов и устанавливает частоту кадров в зависимости от состояния сети. Mosh не заполняет сетевые буферы, поэтому Control-C
всегда работает, чтобы остановить безудержный процесс.
autossh наблюдает за вашим соединением и, если оно выходит из строя, соединяется заново. Это надежнее, чем keepalive. Если вы подключитесь к сеансу экрана, вы продолжите прямо с того места, где вы отключились (см. rscreen
, поставляемый с autossh)
Это классика. Используйте его всякий раз, когда вы рискуете потерять соединение с терминалом.
$ tmux
$ sh do_something_that_takes_forever
!! Connection fails so you reconnect once you notice
$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]
$ tmux attach -t 0
Просто так, вы снова в действии.
Я бы установил и запустил экран, чтобы исправить вашу проблему. Экран позволит вам повторно подключиться к предыдущему сеансу экрана.
Кроме того, screen также позволяет вам делать интересные вещи, такие как разделение экрана, просмотр консоли и т.д. Вы можете найти больше информации здесь и здесь .
Для начала, если вы отключились, вы можете использовать
screen -ls
просматривать ваши сеансы и
screen -r ${session}
восстановить соединение с отключенным.
Как уже отмечали другие, экран, как правило, является лучшим решением для этого, и он также добавляет множество других полезных функций.
Вы можете настроить свой профиль на удаленном компьютере так, чтобы он автоматически запускался и/или снова подключался к экрану при входе в систему, что избавляет вас от необходимости запускать экран в тот раз, когда он вам нужен, потому что у вас пропадает соединение.
Смотрите http://tlug.dnho.net/?q=node/239 (или поищите в Google множество других примеров, делающих слегка разные пути).
Вот еще одно неэкранное решение.
Лоток PuTTY позволяет вам сделать это, у него есть опция переподключения при отключении, которая не является обычной или PuTTY-ng
https://puttytray.goeswhere.com/
это (полностью открытый исходный код) ветвь PuTTY с другими опциями, перейдите к настройкам соединения и есть 2 варианта: один для "попытки переподключения при сбое соединения" и "попытка переподключения при запуске".
более современная альтернатива screen, увы, недоступная для некоторых типов "виртуализации" (например, в cygwin у вас может быть "screen", но не "tmux" из-за способа его разработки), но везде, где у вас есть возможность установить tmux Я настоятельно рекомендую перейти на этот экран.
Хотя screen будет держать ваш сеанс Shell открытым на удаленном сервере, если ваш сеанс ssh будет прерван, он ничего не решит с проблемой разрыва соединений ssh. Как подсказывает zero_r, попробуйте настроить ваше ssh-соединение с помощью keep aive и long timeout.
Я предлагаю вам отследить причину потерянных пакетов, вызывающих проблемы, и исправить это, вместо того чтобы обходить их.
Иногда я тоже забывал запустить экран и терял свою незаконченную работу. В этом случае, хотя мы не можем присоединиться к прерванному сеансу SSH, переписывание запущенной программы на новый терминал и возобновление того, что вы делали, все еще возможно благодаря reptyr
.
После случайного отключения от сеанса SSH первым делом нужно запустить screen
, чтобы соединение не разорвалось. Затем в новом сеансе запустите ps aux | grep {The process to be resumed}
чтобы получить PID. С PID вы можете попробовать reptyr {PID}
или reptyr -T {PID}
(если есть подпроцессы), чтобы продолжить работу.