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

answer

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

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

При первом входе в систему запустите screen. Вы получаете другую оболочку, запускаете в ней команды. Если вы отключены, экранный процесс поддерживает терминал в рабочем состоянии, чтобы ваша оболочка и выполняемые ею процессы не упали. При повторном подключении запустите screen -r, чтобы продолжить.

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

Попробуйте установить ClientAliveInterval (например, 60) и TCPKeepAlive (да или нет) на соответствующие значения на сервере sshd.conf.

Это должно поддерживать ваш сеанс, даже если соединение теряется на несколько минут.

Как упоминалось выше, GNU Screen - это то, что вам нужно. Это позволит вам иметь «сеанс экрана» на удаленном компьютере, в котором вы можете запускать несколько команд через несколько «экранных окон». Это просто отключится, если ваше родительское соединение SSH умирает, сохраняя все подпроцессы, работающие в нем, живыми и здоровыми.

' man screen', как обычно, ваш друг, и пакет ОС должен называться ' screen', если он не установлен по умолчанию.

Основы:

  • Запустите сеанс экрана (на удаленном хосте):

    $ screen
    
  • Отключение от вашего экрана сессии: CTRL-A,d

  • Повторно подключитесь к сеансу экрана после повторного входа в систему:

    $ screen -d -r
    
  • Откройте другое «окно» экрана: CTRL-A,c

  • Цикл через вас открыт экран окно: CTRL-A,space

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

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

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

Mosh (mobile shell)

Remote terminal application that allows roaming, supports intermittent connectivity, and provides intelligent local echo and line editing of user keystrokes.

Mosh is a replacement for SSH. It's more robust and responsive, especially over Wi-Fi, cellular, and long-distance links.

Mosh is free software, available for GNU/Linux, FreeBSD, Solaris, Mac OS X, and Android.

Возможности с сайта:

  • Сменить IP. Оставайтесь на связи : Mosh автоматически перемещается при переключении между подключениями к Интернету. Используйте Wi-Fi в поезде, Ethernet в отеле и LTE на пляже: вы останетесь в системе. Большинство сетевых программ теряют соединение после роуминга, включая SSH и веб-приложения, такие как Gmail. Мош другой.

  • Идеально для сладких снов : с Mosh вы можете перевести свой ноутбук в режим сна и разбудить его позже, сохранив при этом соединение. Если ваше интернет-соединение разорвется, Мош предупредит вас, но соединение возобновится, когда сетевая услуга вернется.

  • Избавьтесь от задержки сети : SSH ожидает ответа сервера, прежде чем показать вам ваш собственный ввод. Это может привести к паршивому пользовательскому интерфейсу. Mosh отличается: он мгновенно реагирует на ввод, удаление и редактирование строки. Он делает это адаптивно и работает даже в полноэкранных программах, таких как emacs и vim. При плохом соединении невыполненные прогнозы подчеркнуты, чтобы вас не обманули.

  • Нет привилегированного кода. Нет демона : вам не нужно быть суперпользователем, чтобы установить или запустить Mosh. Клиент и сервер - это исполняемые файлы, запускаемые обычным пользователем и действующие только в течение всего срока действия соединения.

  • Тот же метод входа в систему : Mosh не прослушивает сетевые порты и не аутентифицирует пользователей. Клиент mosh входит на сервер через SSH, и пользователи представляют те же учетные данные (например, пароль, открытый ключ), что и раньше. Затем Мош запускает мош-сервер удаленно и подключается к нему по 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 наблюдает за вашим подключением и, если оно выходит из строя , подключается повторно. Это более надежно, чем пакеты поддержки активности. Если вы подключитесь к сеансу экрана, вы продолжите прямо с того места, где вы отключились (см. rscreenЧто идет с autossh)

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} 

для переподключения к отключенному.

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

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

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

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

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

В то время как screen будет держать ваш сеанс оболочки открытым на удаленном сервере, если ваш сеанс ssh прерывается, он не будет ничего делать с проблемой сбрасывания ssh-соединений. Как предлагает zero_r, попробуйте настроить свое ssh-соединение с сохранением активности и длительными тайм-аутами.

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

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

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

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

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 проблема была решена.