Как я могу подключиться к сеансу SSH после разорванного канала?

28

Поэтому я работал apt-get upgradeна сервере, когда маршрутизатор решил, что прошло слишком много времени с тех пор, как он в последний раз меня разозлил: он разорвал все соединения. Мораль этой истории состоит в том, чтобы screenмного использовать, когда вы находитесь на Bum Router.

Как бы то ни было, я снова вошел в систему и обнаружил в htop, что процесс все еще там висит, все еще ожидая обновления моего Y / N (к счастью, еще не нажал). Можно ли как-нибудь присоединиться к сеансу, который был прерван? Я закончил тем, что просто убил его, поскольку он не был в центре управления пакетами, но было бы здорово узнать об этом в будущем.

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

Ответы:

16

Ответ на ваш правильный вопрос: вы не можете . Я думаю, что основная проблема заключается в том, что процедуры аутентификации будут не синхронизированы. Просто так не работает.

Как вы сами заметили, решение состоит в том, чтобы по возможности использовать screen (кстати, tmux является альтернативой screen).

январь
источник
1
Но что, если у вас есть ssh без пароля? Вы можете сделать это тогда?
Шридхар Сарнобат
1
byobuхороший, более простой в использовании интерфейс для screen(или tmux) - определенно стоит посмотреть (:
drevicko
Шридхар-Самобол, аутентификация еще должна пройти. Присоединение к запущенному сеансу не может снова выполнить первоначальное рукопожатие, поэтому его инварианты будут нарушены, если мы введем новый сеанс в существующий. Ответ: нет.
kevr
9

Для запуска длительных процессов я использую screen или byobu, если вы хотите более дружественный интерфейс.

Для экрана вы можете использовать:

screen [program] [args]

Это запустит [программу] и ее [аргументы] в сеансе экрана . После завершения программы сеанс автоматически закрывается. Если вы хотите сохранить сеанс после запуска вашей программы, просто запустите экран без каких-либо аргументов, и внутри сеанса появится новое приглашение. CTRL + A + D отсоединяет терминал от текущего сеанса.

Чтобы повторно присоединиться к предыдущему сеансу:

screen -r

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

Бёбу - хорошее улучшение. Он основан на экране , но в нижней части экрана есть панель, которая показывает все текущие сеансы в виде вкладок и упрощает их перемещение. Вы можете:

  • F2 начать новый сеанс
  • F3 перейти к следующей вкладке сессии слева
  • F4 перейти к следующей вкладке сессии справа
  • F8 дает понятное имя вкладке текущей сессии
  • F9 открывает меню настроек
  • CTRL + A + D отсоединяет все сеансы от терминала.

СЛОВО СОВЕТА : не оставляйте сеанс открытым с пользователем root . Если кто-либо получает доступ к вашему терминалу (локально или удаленно), он может легко повторно подключиться к текущему сеансу и использовать вашу систему в качестве пользователя root. При необходимости лучше начать сеанс, используя обычные пользовательские и sudo индивидуальные командные строки при необходимости.

JulioHM
источник
1
Позвольте мне процитировать ОП: «Мораль этой истории - много использовать экран ». Видимо, это был не вопрос здесь.
январь
Спасибо за рецензию, но январь был верным.
Используйте команду sudo screen <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

Затем с pid, который вы нашли для вашего процесса:

$ 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.

tanius
источник
1

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

Примечание: это было обновление с Ubuntu 14.04 до 16.04.

haelix
источник