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

157

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

бледная лошадь
источник
10
Я не могу поверить, что никто не упомянул mosh.mit.edu
jwbensley
@javano: я никогда не слышал об этом. Добавьте это как ответ!
kbyrd
@kbyrd сделали;)
jwbensley
аналогичный вопрос был задан в unix.stackexchange.com/questions/105001/… с некоторыми подсказками о том, как в первую очередь обойти разъединения ...
anarcat

Ответы:

136

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

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

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

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

kbyrd
источник
18
Или используйте tmux - «более холодный» экран, я использовал оба и очень предпочитаю tmux, потому что вы можете красиво разделить термин.
Джон Хант
3
Я был рад обнаружить, что screenон уже установлен на моем Ubuntu 12.x, поэтому, если вы не уверены, просто попробуйте эту команду, она переподключится и возобновит процесс do-release-upgrade : sudo screen -D -r
bjm88
1
@ bjm88, sudoследует использовать только в том случае, если исходный сеанс экрана был инициирован с помощью sudo. В противном случае он вернется, как если бы не было сеанса экрана:There is no screen to be detached
Ноам Манос
+1 Я понимаю, что это не фактический ответ; однако, это screen -rбыло именно то , что я искал.
Эрик Нельсон
130

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

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

zero_r
источник
24
Пока что вы, кажется, единственный, кто действительно отвечает на вопрос, вместо того, чтобы предлагать экран в качестве обходного пути.
kbyrd
2
Хороший звонок. Мы нашли этот метод особенно полезным при обходе межсетевых экранов cisco ASA / PIX, которые по умолчанию любят устанавливать тайм-аут соединения tcp.
Майк Паунтни
5
Может быть, это не то место, где можно спрашивать, но может ли постер менять ответы? Мы должны ответить «на экране» (мой не самый лучший, мне нравится Майк Паунтни, но у меня есть представитель) с этой информацией.
kbyrd
1
Будет ли это работать при подключении через VPN-соединение Cisco, а VPN-соединение теряется и восстанавливается?
Brent
у меня экран работает отлично, я могу подключиться к проверенной задаче и продолжить работу
интегратор
65

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

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

Основы:

  • Начните сеанс экрана (на вашем удаленном хосте):

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

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

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

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

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

Майк Паунтни
источник
1
Да, это гораздо лучший ответ, чем мой.
kbyrd
Могу ли я подключиться к отключенному сеансу SSH, если перезагрузить компьютер, на котором запущен экран?
BarathVutukuri
tmux более мощный
Pegasus
46

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

jwbensley
источник
8
Mosh - это не оболочка ssh - это другой протокол, почти полностью не связанный с ssh (он использует только ssh для входа в систему).
JCH
+1 Очень верно, моя ошибка.
Jwbensley
2
Как насчет безопасности, человек посередине? шифрование? обмен ключами?
Насир Икбал
Мош выглядит удивительным, хотя , к сожалению , не поддерживает переадресацию портов еще .
Boann
20

autossh наблюдает за вашим подключением и, если оно выходит из строя, подключается заново Это надежнее, чем keepalive. Если вы подключитесь к сеансу экрана, вы продолжите прямо с того места, где вы отключились (смотрите, rscreenчто идет с autossh)

hayalci
источник
1
вне настраиваемого поддержания активности он по сути не позволяет вам повторно подключиться к сеансу (то, что ищет ОП). но autossh может быть очень полезно для приложений , которые требуют SSH туннелей, портов отображения и т.д.
Ives
да, autossh + screen будет лучшим местом. Autossh имеет rscreenдля этого.
Hayalci
Автосш лучше чем мош. Я использовал оба.
Шридхар Сарнобат
Вот сообщение в блоге Джесси Китинг об использовании autossh с экраном .
Сампаблокупер
12

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

Просто так, вы снова в действии.

Jacksonkr
источник
Благодаря тонну! Я искал, как это сделать с tmux, так как большинство людей считают, что это лучший вариант.
CoolOppo
10

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

Кроме того, screen также позволяет вам делать интересные вещи, такие как разделение экрана, просмотр консоли и т. Д. Более подробную информацию вы можете найти здесь и здесь .

Для начала, если вы отключились, вы можете использовать

screen -ls

просматривать ваши сеансы и

screen -r ${session} 

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

wzzrd
источник
4

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

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

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

Дэвид Спиллетт
источник
3

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

CEPAL
источник
3

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

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

https://puttytray.goeswhere.com/

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

munkiepus
источник
1
Эхх. Он поставляется с кейлоггером и автоматической утилитой ppk exfiltration, случайно?
Охотник на оленей
1
Я предполагаю, что вы спрашиваете, если он как-то украл ваши данные, это полностью открытый исходный код, исходный код доступен на github, если вы хотите посмотреть его github.com/FauxFaux/PuTTYTray, есть немало авторов: )
Манкипус
отличное приветствие :)
munkiepus
2

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

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

Дэвид
источник
Спасибо за предложение. Мы работаем над поиском основной проблемы потери пакетов, просто нужно время, чтобы разобраться (очень сложно!). Это действительно обходной путь для этого трудного периода. Никогда не знаешь, когда что-то вызовет обрыв соединения.
бледная лошадь
1
Это создаст много шума, но вы можете попробовать запустить ssh через strace и посмотреть, что он делает / сообщает, когда соединение ssh обрывается. Это может просто сообщить, что вы уже знаете, но кто знает ...
Дэвид
1

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

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

march_happy
источник