Как подключиться к отключенному сеансу SSH

Есть ли способ подключиться к сеансу ssh, который был отключен? У нас проблемы с сетевым подключением к удаленному сайту, над которым мы работаем отдельно; тем не менее, в то же время мы испытываем большое количество отключений из-за потерянных пакетов при подключении к серверам в удаленном местоположении. Часто сеанс некоторое время остается активным, а иногда это происходит в середине какого-либо действия (редактирование файла, запуск какого-либо процесса и т. Д.), К которому мне нужно вернуться, а не перезапустить, если это возможно.

15 ответов

Решение

ОБНОВЛЕНИЕ: для фактического ответа см. Ответ zero_r ниже

Это не ответ, а обходной путь. Используйте экран.

При первом входе в систему запустите экран. Вы получаете другую оболочку, запускаете команды в этом. Если вы отключены, экранный процесс поддерживает работу терминала, чтобы ваша оболочка и процессы, на которых он работает, не падали. При повторном подключении запустите '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, пробел

Есть много интересных вещей, которые вы можете сделать с помощью Screen. Я использую его более 10 лет и до сих пор выясняю новые возможности. Это моя любимая утилита Unix.

Я не могу поверить, что никто не упомянул MOSH;

Mosh - это отдельный протокол, который может подключиться к процессу входа в систему SSH, он поддерживает ваш сеанс после нескольких дней отключения, смены IP-адреса, высокой задержки и так далее. Это объясняется на домашней странице лучше, чем я могу объяснить, поэтому я скопировал описание ниже. Мой опыт и советы таковы, что я использую его на своем мобильном телефоне Android, это спасает жизнь во время путешествий и SSH'ing. То же самое верно для моего ноутбука, когда он привязан к мобильному телефону в поезде, например. Я рекомендую компилировать из исходного кода, чтобы получить последнюю версию, для меня в репо-версии внутри Ubuntu есть несколько неприятностей, которые исправлены в самой последней версии (на момент написания).

Mosh (мобильная оболочка)

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

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. При плохой связи недооцененные прогнозы подчеркнуты, поэтому вы не будете введены в заблуждение.

  • Нет привилегированного кода. Нет демона: вам не нужно быть суперпользователем, чтобы установить или запустить 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 что идет с автосш)

Иногда я тоже забывал запустить экран и терял свою незаконченную работу. В этом случае, хотя мы не можем присоединиться к прерванному сеансу SSH, переписывание запущенной программы на новый терминал и возобновление того, что вы делаете, все еще возможно благодаря reptyr,

После случайного отключения от сеанса SSH первым делом нужно запустить screen чтобы связь не разорвалась снова. Затем в новом сеансе запустите ps aux | grep {The process to be resumed} чтобы получить PID. С PID, вы можете попробовать reptyr {PID} или же reptyr -T {PID} (если есть подпроцессы), чтобы продолжить работу.

tmux

Это классика. Используйте его всякий раз, когда вы рискуете потерять соединение с терминалом.

$ 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} 

восстановить соединение с отключенным.

Используйте для переназначения работающей программы на новый терминал.

КАК:

Предположим, что мы подключались с какого-то предыдущего IP-адреса.aaa.bbb.ccc.old,
затем запустите процесс, и в середине работы соединение оборвалось.

Мы входим в систему сsshеще раз (необязательно с другого IP-адреса)aaa.bbb.ccc.new).
Текущее соединение используетpty/1псевдотерминал:

$ tty 
/dev/ pts/1

Но есть два открытых соединения: текущее и старое сломанное, используя:

$ who 
user      pts/0         22 февраля 2022 22:00 ( aaa.bbb.ccc.old )
пользователь      pts/1         22 февраля 2022 22:11 ( aaa.bbb.ccc.new )

Давайте перечислим все оболочки и их подпроцессы:

$ пс на
USER PID %CPU %MEM VSZ RSS TTY STAT ВРЕМЯ НАЧАЛА КОМАНДА
user         2000   1.3 0.5 10168 5236 очков/1     Ss 22:11 0:00 -bash 
user 2001 0.0 0.3 10620 3304 очков/1 R+ 22:11 0:00 \_ ps auf 
user         1000   0.0 0.5 10168 5132 очков/0     Сс 22: 00 0:00 -bash 
user 1001 5,8 16,0 46639 15839 очков/0 Sl+ 22:00 0:03 \_ aptitude
root 820 0,0 0,1 5836 1840 tty1 Ss+ 22:00 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
root 810 0.0 0.2 7360 2260 ttyS0 Ss+ 22:00 0:00 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220

Есть 2bashснаряды:
текущийpts/1один с работающим PIDps auf
и старый сломанныйpts/0один с работающим PID

Давайте подключимся к старому с помощьюreptyr:

$ sudo Reptyr -T 1000

Таким образом мы получаем доступ к старой оболочке и ее подпроцессам.
Поскольку aptitude использует ncurses, возможно, вам придется нажать Ctrl+ Lили измените размер окна эмулятора терминала, чтобы заставить его перерисоваться.
Теперь мы можем уйтиaptitude, а затем выйдите из старой оболочки (1000),
тем самым возвращаясь к нашей новой оболочке (2000) с оставшимся только 1 соединением, которое является текущим:

$ who 
user      pts/1         22 февраля 2022 22:11 (aaa.bbb.ccc.new)

Как уже отмечали другие, экран, как правило, является лучшим решением для этого, и он также добавляет множество других полезных функций.

Вы можете настроить свой профиль на удаленном компьютере так, чтобы он автоматически запускался и / или снова подключался к экрану при входе в систему, что избавляет вас от необходимости запускать экран в тот раз, когда он вам нужен, потому что у вас пропадает соединение.

См. http://tlug.dnho.net/?q=node/239 (или поищите в Google множество других примеров, сделанных немного по-другому).

Более современная альтернатива screen, увы, недоступная для некоторых типов "виртуализации" (например, в cygwin у вас может быть "screen", но не "tmux" из-за способа его разработки), но везде, где у вас есть возможность установить tmux Я настоятельно рекомендую перейти на этот экран.

Хотя screen будет держать ваш сеанс оболочки открытым на удаленном сервере, если ваш ssh-сеанс будет прерван, он ничего не решит с проблемой потери соединений ssh. Как подсказывает zero_r, попробуйте настроить ssh-соединение с помощью keep alives и long timeouts.

Я предлагаю вам отследить причину потерянных пакетов, вызывающих проблемы, и исправить это, вместо того чтобы обходить их.

Вот еще одно неэкранное решение.

Лоток для замазки позволяет вам сделать это, у него есть опция переподключения при отключении, которая отсутствует в обычной или putty-ng

https://puttytray.goeswhere.com/

это ветвь замазки с другими опциями, перейдите в настройки соединения и есть 2 опции, одна для "попытка переподключения при сбое соединения" и "попытка переподключения при запуске".

Еще один вариант - запустить Jupyter Notebook, у которого есть собственный неплохой веб-эмулятор терминала.

Плюсы

  • Когда я повторно подключаю свой vpn, я могу повторно открыть все свои соединения через несколько терминалов на нескольких хостах, открыв все закладки в папке.
  • Я могу открыть терминал на любом устройстве и он выглядит достойно на любом устройстве

Минусы

  • Я теряю историю консоли (не команды, а только прокрутку) после повторного подключения.

Как

  1. На some_host, бежать jupyter-notebook --no-browser --port=$SOME_PORT &.

  2. создать сеанс some_label в вашем браузере, указав на http://some_host:$SOMEPORT/terminals/some_label. Теперь вы можете отключиться.

  3. Добавьте свои сеансы в закладки. При повторном подключении вы можете открыть их все сразу. Если вкладки уже открыты, вам нужно будет обновить их.

Если $SOME_PORT не открыт на some_host, затем используйте ssh для перенаправления портов и подключения к http://localhost:$SOME_LOCAL_PORT/terminals/some_label вместо:

ssh -q -N -f -L localhost:$SOME_LOCAL_PORT:localhost:$SOME_PORT $some_host

Мою проблему было просто решить. В моем файле /etc/sysconfig/network-scripts/ifcfg-eth0 была ошибка: для параметра IPADDR задан статический IP-адрес и BOOTPROTO=dhcp. После обновления параметра BOOTPROTO=static проблема была решена.

Другие вопросы по тегам