Как мне присоединиться к отдельному сеансу mosh?

157

Как мне присоединиться к отдельному сеансу mosh или иным образом избавиться от

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

то есть, что такое mosh эквивалент

screen -D -R

или возможно

screen -wipe

Кроме того, где этот ответ можно найти в документации?

Джон Бабер-Лусеро
источник

Ответы:

197

По соображениям безопасности вы не можете подключить заново, см. Https://github.com/keithw/mosh/issues/394.

Чтобы завершить отдельный сеанс, используйте номер PID, отображаемый в этом сообщении (это часть «XXXX».) Например, если вы видите -

Mosh: You have a detached Mosh session on this server (mosh [12345]).

И можете запустить эту команду:

kill 12345

Также, чтобы закрыть все mosh-соединения, вы можете:

kill `pidof mosh-server`

Обратите внимание, что если вы сейчас подключены через mosh, эта последняя команда также отключит вас.

варта
источник
34
@artfulrobot Потому что есть вероятность, что отдельный сеанс принадлежит mosh-клиенту, который еще где-то жив. Сессии Mosh бродят и могут выжить через цикл приостановки / возобновления (например, «Спящий режим»). Проблема, которую mosh не решает (и не может легко решить), заключается в обнаружении перезагрузки клиентского компьютера без постепенного закрытия сеанса mosh.
Бинки,
7
Есть ли причина не killall mosh-serverвместо этого? Тем более что pidof и killall на самом деле одно и то же.
Джордан
6
@Jordan: В некоторых системах (например, Solaris) killallделает именно то, что говорит.
Приостановлено до дальнейшего уведомления.
4
Если вы подключены через mosh и запускаете, killall mosh-serverвы будете отключены.
0xcaff
1
@ 0xcaff, если вы подключаетесь через mosh и запускаете, kill `pidof mosh-server`вы будете отстранены точно так же
Дэвид
26

К моему изумлению, я использовал CRIU ( https://criu.org ) для проверки и перезапуска клиента mosh, и это сработало.

Shocking.

Найдите PID вашего mosh-клиента:

$ ps -ef | Греп Мош

Затем установите CRIU в соответствии с их инструкциями.

Затем проверьте это так:

контрольно-пропускной пункт $ mkdir

$ sudo ./criu dump -D контрольная точка -t PID --shell-job

Затем восстановите его:

$ sudo ./criu restore -D контрольная точка --shell-job

И вот оно. Ваш клиент mosh вернулся.

Однако следует отметить, что если ваш ноутбук перезагружается (что и является тем, от чего мы пытаемся защитить), mosh использует monotonicчасы для отслеживания времени на стороне клиента, что не работает при перезагрузках. Это НЕ будет работать, однако, если ваш ноутбук только что вышел из строя, он не будет работать, потому что порядковые номера mosh будут не синхронизированы с версией, которая была проверена (двоичный файл возобновится, но связь прекратится).

Чтобы это исправить, вы должны сказать mosh прекратить делать это и загрузить исходный код mosh. Затем отредактируйте этот файл:

cd mosh

vim configure.ac

Затем найдите GETTIMEи закомментируйте эту строку.

Затем сделайте:

autoreconf # или ./autogen.sh, если вы клонировали его впервые

./configure

делать

сделать установку

После этого сеансы клиента mosh с контрольными точками CRIU будут перенесены.

(Очевидно, вам нужно было бы написать что-то, чтобы выполнять контрольные точки достаточно регулярно, чтобы быть полезным. Но это упражнение для читателя).

Майкл Гэлакси
источник
1
Обязательно наберите 'CTRL-L', чтобы обновить вывод экрана после восстановления.
Майкл Гэлакси
6
Из чистого любопытства, есть ли практическая польза от восстановления сеанса клиента mosh, который я пропускаю? Я запускаю tmux на mosh и могу просто перезапустить mosh на клиенте и снова подключить tmux ... есть ли преимущество в этом, кроме его крутого (что это действительно такое!)?
eskhool
1
Длинный ответ: github.com/mobile-shell/mosh/issues/394 Короткий ответ: да: вам не нужен сеанс tmux, если на целевом сервере уже запущен демон mosh-server. Это не только оставляет висячих демонов-мошек, но и еще одну комбинацию клавиш, которую мы не должны печатать в первую очередь.
Майкл Гэлакси
1
Mosh является заменой (в некоторых случаях) SSH, а не экраном. quoth keithw (автор mosh) на github
törzsmókus
19

Я понимаю, что это старый пост, но есть очень простое решение для этого, как предлагает Кит Винстейн, автор mosh, здесь: https://github.com/mobile-shell/mosh/issues/394

«Ну, во-первых, если вы хотите подключиться к сеансу от нескольких клиентов (или после смерти клиента), вам следует использовать screen или tmux. Mosh заменяет (в некоторых случаях) SSH, а не screen. Многие пользователи Mosh используют его вместе с экраном, и им это нравится ».

Сценарий: я вошел на удаленный сервер через mosh. Затем я запустил screen и запустил процесс в сеансе экрана, например, htop. Я теряю связь (умирает батарея ноутбука, теряется сетевое соединение и т. Д.). Я снова подключаюсь через mosh и получаю это сообщение на сервере,

Mosh: у вас есть отдельный сеанс Mosh на этом сервере (mosh [XXXX]).

Все, что мне нужно сделать, это убить предыдущую сессию mosh

убить ХХХХ

и присоедините к сеансу экрана, который все еще существует .

экран -r

Теперь htop (или любой другой запущенный процесс) возвращается так же, как и без прерываний. Это особенно полезно для запуска обновлений или других процессов, которые в случае внезапного прерывания оставляют сервер в грязном, неизвестном состоянии. Я предполагаю, что вы можете сделать то же самое с tmux, хотя я не пробовал. Я полагаю, что именно это предлагали Annihilannic и eskhool.

007
источник
2
Это отличный ответ. Спасибо, и да, я подтвердил, что он работает так же с Tmux.
laughing_man
10

В дополнение к ответу Варты я использую следующую команду, чтобы закрыть все соединения с mosh, кроме текущего:

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill

Александр Бурмак
источник
Если старый сеанс mosh отсутствует, xkill выдаст ошибку. Лучшее использованиеpgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77
4

Как указала @varta, владельцы mosh очень против присоединения от разных клиентов по соображениям безопасности. Так что, если ваш клиент ушел (например, вы перезапустили свой ноутбук), ваш единственный вариант - убить сессии.

Чтобы убить только отдельные сеансы, вы можете использовать следующую строку (которая у меня есть в качестве псевдонима в моем .bashrc).

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

Эта команда зависит от того факта, что whoсписки подключенных пользователей, включая сеансы mosh, только присоединенные сеансы mosh имеют «через mosh», и что для сеансов mosh pid указан в квадратных скобках. Таким образом, он находит pids только для отдельных сеансов mosh и передает их для уничтожения с помощью xargs.

Вот пример whoрезультата для справки:

$ who
theuser    pts/32       2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser    pts/17       2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser    pts/21       2018-01-02 18:52 (mosh [205286])
theuser    pts/44       2017-12-21 13:58 (:1001.0)

Альтернативой является использование переменной окружения mosh-server MOSH_SERVER_SIGNAL_TMOUT. Вы можете установить что-то вроде 300 в вашем .bashrcна стороне сервера . Тогда, если вы сделаете a, pkill -SIGUSER1 mosh-serverон убьет только те mosh-серверы, которые не были подключены за последние 300 секунд (остальные будут игнорировать SIGUSER1). Больше информации на странице руководства mosh-сервера . Я использую команду выше, потому что после псевдонима это кажется мне проще.

Обратите внимание, как упоминало @Annihilannic, если вы используете tmux / screen в своих сеансах mosh, то эти сеансы tmux / screen все еще существуют после того, как вы завершите сеансы mosh. Таким образом, вы все равно можете присоединиться к ним (так что вы действительно не много теряете, убивая сами сеансы mosh).

studgeek
источник
3

Ответы здесь, утверждающие, что убийство mosh-serverявляется единственным вариантом, в значительной степени устарели, поскольку мы можем использовать criuи reptyrдля восстановления и повторного присоединения произвольных процессов.

Не говоря уже о том, что в настоящее время мы можем kill -USR1 mosh-serverуничтожать отдельные сеансы только чистым и безопасным способом, не прибегая к небезопасным whoвыводам или громоздким командам, чтобы избежать уничтожения нашего собственного сеанса.

Рядом с criuответом Майкла Р. Хайнса есть немного более «легкий», reptyrкоторый можно использовать для повторного присоединения процессов, запущенных mosh-server(т.е. не самого mosh-serverсебя). Я обычно использую

pstree -p <mosh-server PID>

перечислить дерево процессов под отключенным mosh-сервером, а затем

reptyr PID

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

kill -USR1 <mosh-server PID>

тогда как я забочусь только о том, чтобы убить сеансы, которые я знаю, мои (общая система).

Irfy
источник
Я получаюUnable to attach to pid 10103: Permission denied
rubo77
-1

Используйте команду ps для получения списка запущенных задач или используйте ps -ef | Греп Мош

Убейте PID mosh с помощью этой команды:

kill <pid>

Также, чтобы закрыть все mosh-соединения, вы можете:

Обратите внимание, что если вы в настоящее время подключены через mosh, то это также отключит вас

kill `pidof mosh-server`
Панкадж Чаухан
источник