Як я можу знову підключитися до сеансу ssh після розбитої труби?


28

Тому я працював apt-get upgradeна сервері, коли маршрутизатор вирішив, що це було занадто довго, оскільки він останній раз мене розлютив: Це перервало все з'єднання. Мораль історії полягає в тому, щоб screenбагато використовувати, коли ви перебуваєте на маршрутизаторі.

У будь-якому випадку я зайшов у систему і виявив у htop, що процес все ще висить там, все ще чекаючи, коли мій Y / n оновиться (ще не вдарив, на щастя). Чи є якийсь спосіб я знову приєднатися до розірваного сеансу? Я в кінцевому підсумку просто вбив його, оскільки він не був посеред управління пакунками, але було б чудово знати для подальшої довідки.


1
Я здивований, що apt-getпроцес все ще тривав. Він повинен був загинути разом з усім процесом до SSH. Я помітив, що do-dist-upgradeавтоматично починається в screen/ byobuсесії: можливо, в деяких обставинах, apt-getте ж саме?
nfirvine

Відповіді:


16

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

Як ви самі помітили, рішення - використовувати екран, коли це можливо (до речі, tmux - це альтернатива екрану).


1
Але що робити, якщо у вас без пароля ssh? Ви можете це зробити тоді?
Шрідхар Сарнобат

1
byobuце приємний, простіший використання переднього кінця до screen(або tmux) - безумовно, варто переглянути (:
drevicko

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

9

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

Для екрана ви можете використовувати:

screen [program] [args]

Це запустить [програму] та її [аргументи] всередині екранного сеансу. Після завершення програми сеанс автоматично закривається. Якщо ви хочете зберегти сеанс після запуску програми, просто запустіть екран без жодних аргументів, і всередині сеансу з’явиться нове підказка. CTRL + A + D відлучає термінал від поточного сеансу.

Щоб повторно долучитись до попереднього сеансу:

screen -r

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

Byobu - це приємне поліпшення. Він заснований на екрані , але надає смугу внизу, яка показує всі поточні сеанси як вкладки та дає простіші ярлики для переміщення по них. Ти можеш:

  • F2 почати новий сеанс
  • F3 - перехід до наступної вкладки сеансу зліва
  • F4 перейдіть до наступної вкладки сеансу праворуч
  • F8 дайте дружнє ім’я поточній вкладці сеансу
  • F9 відкриває меню параметрів
  • CTRL + A + D відключає всі сеанси від терміналу.

СЛОВО ПОСЛУГИ : уникайте відкритого сеансу з користувачем root . Якщо хтось отримає доступ до вашого терміналу (локально або віддалено), він може легко знову приєднатися до поточного сеансу і використовувати вашу систему як корінь. Якщо потрібно, найкраще розпочати сеанс, використовуючи загальні користувацькі та командні рядки sudo indivudual, якщо це необхідно.


1
Чи можу я процитувати ОП: "Мораль історії - багато використовувати екран ". Мабуть, тут не було питання.
січня

Дякую за запис, але січень був правильним.

Використовуйте екран sudo <command>, щоб налаштувати екран як root, який потребує доступу sudo, щоб відновити його. Набагато краще, ніж звичайно запускати екран, а потім змінювати корінь всередині нього.
djsmiley2k - CoW

8

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

Інструкції

У вашому випадку ви б взяли apt-getна себе керований процес з нового сеансу SSH, screenсеансу тощо. Моя улюблена для цього reptyrкоманда:

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

Потім, зі знайденим вами підписом для вашого процесу:

$ sudo reptyr -T 10626

Або якщо це не працює, спробуйте:

$ reptyr 10626

Після цього етапу весь вхід з клавіатури переходить до програми, яку ви взяли на себе. На жаль, ви не побачите старого результату сеансу SSH, наприклад, apt-getвихідного запиту просити підтвердження.

Пояснення

Існує безліч інших інструментів, які в основному працюють так само, як reptyr(тобто через ptraceвкладку налагодження). Дивіться наступні питання та відповіді, де вони обговорюються:

У наведених вище інструкціях reptyr 10626використовується ptraceвкладка налагодження, тоді як sudo reptyr -T 10626команда використовує крадіжку TTY і є кращою ( деталі ).

Нарешті, причина, по якій ви не можете взяти сеанс SSH таким чином, полягає в тому, що sshdпроцес не контролюється хост-терміналом, натомість він надає підлеглу частину терміналу - ptsпристрій - в той час як головна частина, що управляє ним, знаходиться на клієнтська машина, тут із розбитим сеансом SSH між ними. Коли ви змушуєте взяти такий sshdпроцес із reptyr -s <pid>, введення на клавіатурі переходить до цього процесу, а не до активного дочірнього процесу. Тож "Ctrl + Z" просто знищить це sshd.


1

Я робив do-dist-upgradeчерез ssh з ноутбука, який призупинився Broken pipe. Повертаючись до машини, я бачив процеси, пов’язані з оновленням, як і раніше, серед яких whiptailзапитував мене про введення (який менеджер дисплеїв вибрати) і, відповідно, root-власність SCREEN. Я зміг зробити sudo su -і screen -rдолучитися до сеансу, і ось ось у мене діалогове вікно діалогу перед моїми силами взяти вклад. Я зміг відновити оновлення без проблем.

Примітка. Це було оновлення з Ubuntu 14.04 до 16.04.

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