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

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

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

37
задан 28 September 2012 в 01:38

4 ответа

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

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

18
ответ дан 28 September 2012 в 01:38

Пока вы не можете повторно подключившись к прерванному сеансу SSH, вы можете заново родить процесс, выполняющийся внутри SSH - функционально эквивалентно тому, что вы хотите.

Инструкции

В вашем случае вы должны взять на себя apt- получить процесс для управления из сеанса нового SSH, сеанса экрана и т.п. Мне больше всего нравится команда 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 , ввод с клавиатуры передается этому процессу, а не его активному дочернему процессу. Таким образом, «Ctrl + Z» просто убьет этот sshd .

18
ответ дан 28 September 2012 в 01:38

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

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

screen [program] [args]

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

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

screen -r

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

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

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

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

10
ответ дан 28 September 2012 в 01:38

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

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

1
ответ дан 17 October 2019 в 16:24

Другие вопросы по тегам:

Похожие вопросы: