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

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

<p><strong> <em> обновление: фактический ответ см. ниже в ответе zero\_r</em> </strong></p><p>это не ответ, а обходной путь. используйте <a href="http://www.gnu.org/software/screen/">экран</a> .</p><p>при первом входе в систему запустите экран. вы получаете другой shell, запускаете команды в этом. если вы отключены, экранный процесс поддерживает работу терминала, чтобы ваша консоль и процессы, на которых она работает, не перепадали. при повторном подключении запустите 'screen -r', чтобы продолжить.</p><p>существует множество способов настройки и использования экрана, но вышеприведенное должно решить вашу проблему.</p>

<p>попробуйте установить clientaliveinterval (например, 60) и tcpkeepalive (да или нет) в соответствующие значения на стороне сервера sshd.conf.</p><p>это должно поддерживать ваш сеанс, даже если соединение теряется на несколько минут.</p>

<p>как уже упоминалось выше, <a href="http://www.gnu.org/software/screen/">gnu screen</a> это путь. это позволит вам иметь "сеанс экрана" на удаленном блоке, в котором вы можете запускать несколько команд через несколько "окон экрана". он просто отсоединится, если ваше родительское ssh-соединение прекратит работу, и все подпроцессы, работающие в нем, будут работать нормально.</p><p>"<code>man screen</code> 'как обычно ваш друг, и пакет ос должен называться' <code>screen</code> ', если он не установлен по умолчанию.</p><p>основы:</p><ul> <li> <p>начните сеанс экрана (на вашем удаленном хосте):</p> <pre><code>$ screen   отключиться от сеанса экрана: ctrl-a, d   повторно подключитесь к сеансу экрана после повторного входа в систему: $ screen -d -r </code></pre></li> <li> <p>откройте другое окно "окно": <kbd>ctrl-a</kbd>, <kbd>c</kbd></p> </li> <li> <p>цикл через открытые окна экрана: <kbd>ctrl-a</kbd>, <kbd>space</kbd></p> </li> </ul><p>там есть <i>много</i> из классных вещей, которые вы можете сделать с экрана. я использую его более 10 лет и до сих пор выясняю новые возможности. это моя любимая утилита unix.</p>

<p>я не могу поверить, что никто не упомянул <a href="http://mosh.mit.edu/"> mosh </a> ;</p><p>mosh - это отдельный протокол, который может подключиться к процессу входа в ssh, он поддерживает ваш сеанс после нескольких дней отключения, смены ip-адреса, высокой задержки и так далее. это объясняется на домашней странице лучше, чем я могу объяснить, поэтому я скопировал описание ниже. мой опыт и советы заключаются в том, что я использую его на своем android мобильном телефоне, это спасает жизнь во время путешествий и работы по ssh. то же самое верно и для моего ноутбука, когда он привязан к мобильному телефону в поезде, например я рекомендую компилировать из исходного кода, чтобы получить последнюю версию, для меня в репо-версии внутри ubuntu есть несколько неприятностей, которые исправлены в самой последней версии (на момент написания).</p><blockquote> <p>мош (мобильный shell)</p> <p>приложение для удаленного терминала, которое позволяет осуществлять роуминг, поддерживает прерывистое соединение и обеспечивает интеллектуальное локальное эхо и редактирование строк пользовательских нажатий клавиш.</p> <p>mosh - это замена ssh. он более надежный и отзывчивый, особенно по wi-fi, сотовой связи и междугородной связи.</p> <p>mosh - бесплатное программное обеспечение, доступное для gnu/linux, freebsd, solaris, mac os x и android.</p> </blockquote><p>особенности с сайта:</p><ul> <li> <p><strong> изменить ip. оставайтесь на связи </strong>: mosh автоматически перемещается при переходе между подключениями к интернету. используйте wi-fi в поезде, ethernet в отеле и lte на пляже: вы останетесь в системе). большинство сетевых программ теряют соединения после роуминга, включая ssh и такие веб-приложения, как gmail. мошь отличается.</p> </li> <li> <p><strong> создает сладкие сны </strong>: с помощью mosh вы можете перевести свой ноутбук в спящий режим и разбудить его позже, сохранив соединение без изменений. если ваше интернет-соединение обрывается, mosh предупредит вас, но соединение возобновится, когда услуга сети вернется.</p> </li> <li> <p><strong> избавьтесь от сетевых задержек </strong>: ssh ждет ответа сервера, прежде чем показывать вам свой набор текста. это может сделать для паршивого пользовательского интерфейса. mosh отличается: он мгновенно реагирует на ввод, удаление и редактирование строк. он делает это адаптивно и работает даже в полноэкранных программах, таких как emacs и vim. при плохой связи недооцененные прогнозы подчеркнуты, чтобы вас не вводили в заблуждение.</p> </li> <li> <p><strong> нет привилегированного кода. no daemon </strong>: вам не нужно быть суперпользователем для установки или запуска mosh. клиент и сервер - это исполняемые файлы, запускаемые обычным пользователем и действующие только на время существования соединения.</p> </li> <li> <p><strong> тот же метод входа в систему </strong>: mosh не прослушивает сетевые порты и не проверяет подлинность пользователей. клиент mosh входит на сервер через ssh, и пользователи представляют те же учетные данные (например, пароль, открытый ключ), что и раньше. затем mosh запускает mosh-сервер удаленно и подключается к нему через udp.</p> </li> <li> <p><strong> работает внутри вашего терминала, но лучше </strong>: mosh - программа командной строки, как ssh. вы можете использовать его внутри xterm, gnome-terminal, urxvt, terminal.app, iterm, emacs, screen или tmux. но mosh был разработан с нуля и поддерживает только один набор символов: utf-8. это исправляет ошибки unicode в других терминалах и в ssh.</p> </li> <li> <p><strong> control-c отлично работает </strong>: в отличие от ssh, протокол mosh на основе udp корректно обрабатывает потери пакетов и устанавливает частоту кадров в зависимости от состояния сети. mosh не заполняет сетевые буферы, поэтому control-c<br> всегда работает, чтобы остановить безудержный процесс.</p> </li> </ul>

<p> <a href="http://www.harding.motd.ca/autossh/">autossh</a> наблюдает за вашим соединением и, если оно выходит из строя, соединяется заново. это надежнее, чем keepalive. если вы подключитесь к сеансу экрана, вы продолжите прямо с того места, где вы отключились (см. <code>rscreen</code>, поставляемый с autossh)</p>

<h1>tmux</h1><p>это классика. используйте его всякий раз, когда вы рискуете потерять соединение с терминалом.</p><pre><code>$ 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 </code></pre><p>просто так, вы снова в действии.</p>

<p>я бы установил и запустил экран, чтобы исправить вашу проблему. экран позволит вам повторно подключиться к предыдущему сеансу экрана.</p><p>кроме того, screen также позволяет вам делать интересные вещи, такие как разделение экрана, просмотр консоли и т.д. вы можете найти больше информации <a href="http://en.wikipedia.org/wiki/gnu\_screen">здесь</a> и <a href="http://www.gnu.org/software/screen/">здесь</a> .</p><p>для начала, если вы отключились, вы можете использовать</p><pre><code>screen -ls </code></pre><p>просматривать ваши сеансы и</p><pre><code>screen -r ${session} </code></pre><p>восстановить соединение с отключенным.</p>

<p>как уже отмечали другие, экран, как правило, является лучшим решением для этого, и он также добавляет множество других полезных функций.</p><p>вы можете настроить свой профиль на удаленном компьютере так, чтобы он автоматически запускался и/или снова подключался к экрану при входе в систему, что избавляет вас от необходимости запускать экран в тот раз, когда он вам нужен, потому что у вас пропадает соединение.</p><p>смотрите <a href="http://tlug.dnho.net/?q=node/239">http://tlug.dnho.net/?q=node/239</a> (или поищите в google множество других примеров, делающих слегка разные пути).</p>

<p>вот еще одно неэкранное решение.</p><p>лоток putty позволяет вам сделать это, у него есть опция переподключения при отключении, которая не является обычной или putty-ng</p><p> <a href="https://puttytray.goeswhere.com/">https://puttytray.goeswhere.com/</a> </p><p>это (полностью открытый исходный код) ветвь putty с другими опциями, перейдите к настройкам соединения и есть 2 варианта: один для "попытки переподключения при сбое соединения" и "попытка переподключения при запуске".</p>

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

<p>хотя screen будет держать ваш сеанс shell открытым на удаленном сервере, если ваш сеанс ssh будет прерван, он ничего не решит с проблемой разрыва соединений ssh. как подсказывает zero\_r, попробуйте настроить ваше ssh-соединение с помощью keep aive и long timeout.</p><p>я предлагаю вам отследить причину потерянных пакетов, вызывающих проблемы, и исправить это, вместо того чтобы обходить их.</p>

<p>иногда я тоже забывал запустить экран и терял свою незаконченную работу. в этом случае, хотя мы не можем присоединиться к прерванному сеансу ssh, переписывание запущенной программы на новый терминал и возобновление того, что вы делали, все еще возможно благодаря <code>reptyr</code>.</p><p>после случайного отключения от сеанса ssh первым делом нужно запустить <code>screen</code>, чтобы соединение не разорвалось. затем в новом сеансе запустите <code>ps aux | grep {the process to be resumed}</code> чтобы получить pid. с pid вы можете попробовать <code>reptyr {pid}</code> или <code>reptyr -t {pid}</code> (если есть подпроцессы), чтобы продолжить работу.</p>