Як підключитися до відключеного сеансу ssh


156

Чи є спосіб підключитися до відключеного сеансу ssh? У нас виникають проблеми з нашим мережним підключенням до віддаленого сайту, над яким ми працюємо окремо; однак у цей час ми відчуваємо велику кількість відключень через втрачені пакети під час підключення до серверів у віддаленому місці. Багато разів сеанс деякий час залишається активним, а іноді трапляється посеред якоїсь дії (редагування файлів, запуск певного процесу тощо), до якої мені потрібно повернутися, а не перезапустити, якщо можливо.


10
Я не можу повірити, що ніхто не згадав mosh.mit.edu
jwbensley

@javano: Я ніколи про це не чув. Додайте це як відповідь!
kbyrd

@kbyrd зробили;)
jwbensley

аналогічне запитання було задано в unix.stackexchange.com/questions/105001/… з деякими підказками, як в першу чергу обійти відключення ...
anarcat

Відповіді:


135

ОНОВЛЕННЯ: Дійсна відповідь див. Відповідь zero_r нижче

Це не відповідь, а обхід. Використовувати екран .

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

Існує ще багато можливостей для налаштування та використання екрана, але вищезазначене повинно вирішити вашу проблему.


18
Або використовуйте tmux - "кулер" екран, я використовував і те, і дуже віддаю перевагу tmux, тому що ви можете добре розділити термін.
Джон Хант

3
Я радий виявив, що screenвже встановлений на моєму Ubuntu 12.x, тому якщо ви не впевнені, просто спробуйте цю команду, вона знову підключиться та відновить процес до-реліз-оновлення : sudo screen -D -r
bjm88

1
@ bjm88, sudoслід використовувати лише в тому випадку, якщо початковий сеанс екрана був ініційований судо. Інакше він повернеться так, ніби не існує сеансу екрана:There is no screen to be detached
Ноам Манос

+1 Я розумію, що це не справжня відповідь; однак screen -rбуло саме те , що я шукав.
Ерік Нельсон

129

Спробуйте встановити для ClientAliveInterval (наприклад, 60) і TCPKeepAlive (так чи ні) відповідні значення на сервері sshd.conf.

Це повинно підтримувати сеанс в живих, навіть якщо зв’язок втрачається на хвилини.


24
Поки, здається, ви єдиний, хто насправді відповідає на питання замість того, щоб запропонувати екран як вирішення.
kbyrd

2
Гарний дзвінок. Ми знайшли цей метод особливо корисним при проходженні брандмауерів cisco ASA / PIX, які за замовчуванням обожнюють вичакувати з'єднання tcp.
Майк Паутні

5
Можливо, це не правильне місце для запитання, але чи можливо, щоб плакат міняв відповіді? Ми повинні відповісти на екрані (моя не найкраща, мені подобається Майк Паутні, але я отримав відповідь) з цією інформацією.
kbyrd

1
Чи буде це спрацьовувати при підключенні через VPN-з'єднання Cisco, а з'єднання VPN буде втрачено та відновлено?
Брент

для мене екран працює ідеально, я можу знову підключитися до екранізованого завдання і налаштований на роботу
integratorIT

64

Як згадувалося вище, GNU Screen - це шлях. Це дозволить вам мати «сеанс екрана» у віддаленому вікні, в якому ви можете запускати кілька команд, через кілька вікон екрану. Це просто від'єднається, якщо ваш батьківський з’єднання SSH помер, зберігаючи всі підпроцеси, що працюють у ньому, живими та здоровими.

" man screen" є вашим другом, як завжди, і пакет ОС повинен називатися " screen", якщо він не встановлений за замовчуванням.

Основи:

  • Почніть сеанс на екрані (на віддаленому хості):

    $ screen
    
  • Відключіться від екранного сеансу : CTRL-A,d

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

    $ screen -d -r
    
  • Відкрийте інше «вікно» екрану: CTRL-A,c

  • Пройдіться через відкриті вікна екрану : CTRL-A,space

З екраном можна багато цікавих речей. Я використовую його вже більше 10 років, і досі знаходжу нові функції. Це моя улюблена утиліта Unix.


1
Так, це набагато краща відповідь, ніж моя.
kbyrd

Чи можу я все-таки підключитися до відключеного сеансу ssh, якщо перезавантажую ПК, де працює екран?
BarathVutukuri

tmux потужніший
Пегас

46

Я не можу повірити, що ніхто не згадав МОШ ;

Mosh - це окремий протокол, який може підключитися до процесу входу в SSH, він підтримує ваш сеанс живим після днів відключення, зміни IP, високої затримки тощо. Це пояснено на домашній сторінці краще, ніж я можу пояснити, тому я скопіював опис нижче. Мій досвід та поради полягають у тому, що я використовую його на своєму мобільному Android, це рятує життя під час подорожей та SSH'ing. Те саме стосується мого ноутбука, коли, наприклад, зв’язується з мобільним у поїзді. Я рекомендую компілювати з джерела, щоб отримати останню версію, для мене версія Repo всередині 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, екран або tmux. Але mosh був розроблений з нуля і підтримує лише один набір символів: UTF-8. Він виправляє помилки Unicode в інших терміналах та в SSH.

  • Control-C працює чудово : на відміну від SSH, протокол, що базується на UDP, витончено обробляє втрати пакету та встановлює частоту кадрів на основі мережевих умов. Mosh не заповнює мережеві буфери, тому Control-C
    завжди працює, щоб зупинити відвернутий процес.


8
Mosh - це не ssh обгортка - це інший протокол, майже повністю не пов'язаний з ssh (він використовує лише ssh для входу).
jch

+1 Дуже правда, моя помилка.
jwbensley

2
А як щодо безпеки, людина посередині? шифрування? обмін ключами?
Насір Ікбал

Мош виглядає дивним, хоча , до жаль , не підтримує переадресацію портів ще .
Боан

20

autossh спостерігає за вашим з'єднанням, і якщо він знижується, він знову підключається. Це надійніше, ніж кизильники. Якщо ви підключитесь до екранного сеансу, ви продовжите прямо з того місця, де ви від'єдналися (див. rscreenФункцію автоматичного введення)


1
за межами налаштованого режиму зберігання в живому стані, це не дозволяє вам знову підключитися до сесії (що шукала ОП). але autossh може бути дуже корисним для програм, які потребують ssh тунелів, картографування портів тощо
ives

так, autossh + екран буде найкращим місцем. autossh має rscreenдля цього.
hayalci

Автосш краще, ніж мош. Я використовував і те, і інше.
Шрідхар Сарнобат

Ось публікація в блозі Джессі Кітінга про використання автоматичного пошуку за допомогою екрана .
sampablokuper

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

Просто так, ви знову в дії.


Дякую тонну! Я шукав, як це зробити з tmux, оскільки, здається, саме це більшість людей вважає кращим варіантом.
CoolOppo

10

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

Крім цього, екран також дозволить вам робити цікаві речі, такі як розділити екран, переглянути консоль тощо. Ви можете знайти більше інформації тут і тут .

Для початку, якщо ви відключитесь, можете скористатися

screen -ls

для перегляду своїх сеансів і

screen -r ${session} 

підключитися до відключеного.


4

Як зазначають інші, екран зазвичай є найкращим рішенням для цього, і він також додає безліч інших корисних функцій.

Ви можете налаштувати свій профіль на віддаленій машині для автоматичного запуску та / або підключення до екрана при вході в систему, що заощаджує ви забули запустити екран один раз, коли вам це потрібно, тому що ви зазнаєте перепаду з'єднання.

Дивіться сторінку http://tlug.dnho.net/?q=node/239 (або шукайте в Google багато інших прикладів, дещо різними способами).


3

більш сучасна альтернатива екрану, на жаль, недоступна для деяких типів "віртуалізації" (наприклад, у cygwin ви можете мати "екран", але не "tmux" завдяки способу, який він розроблений), але де б ви не мали можливості встановити tmux , Я настійно рекомендую перейти на той, хто встав екран.


3

Ось ще одне неекранне рішення.

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

https://puttytray.goeswhere.com/

це (повністю відкритий вихідний код) шпаклівки з іншими параметрами, перейдіть до налаштувань з'єднання, і є 2 варіанти, один для "спроби повторного підключення при відмові з'єднання" та "спроба знову підключитися при запуску".


1
Е-е. Чи є в комплекті з кейлоггером і автоматичною утилітою ексфільтрації ppk?
Мисливець на олень

1
Я припускаю, що ви запитуєте, чи це якимось чином, краде ваші дані, це повністю відкритий код, вихідний код доступний на github, якщо ви хочете подивитися його github.com/FauxFaux/PuTTYTray , є досить багато учасників: )
munkiepus

велике ура :)
munkiepus

2

Хоча на екрані буде зберігатися сеанс оболонки відкритим на віддаленому сервері, якщо ваш ssh сеанс відпаде, він нічого не призведе до проблеми скидання ssh-з'єднань. Як пропонує zero_r, спробуйте налаштувати своє ssh-з'єднання із збереженням живих та довгих тайм-аутів.

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


Дякую за пропозицію. Ми працюємо над відстеженням кореневої проблеми втрати пакету, для того, щоб розібратися в цьому, потрібно просто небагато часу (дуже хитро, це!). Це дійсно є вирішенням цього періоду проблем. Ніколи не знає, коли щось спричинить перерваний зв’язок.
блідий кінь

1
Це створить багато шуму, але ви можете спробувати запустити ssh через strace і подивитися, що він робить / звітує, коли ssh-з'єднання падає. Це може просто повідомити про те, що ви вже знаєте, але хто знає ...
Девід

1

Іноді я також забував запустити екран і втратив незакінчену роботу. У цьому випадку, хоча ми не можемо знову приєднатись до зламаного сеансу SSH, перезапуск запущеної програми на новий термінал і відновлення того, що ви робили, все ще можливо завдяки reptyr.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.