Come posso ricollegarmi a una sessione mosh separata?


157

Come posso ricollegarmi a una sessione di mosh distaccata o altrimenti sbarazzarmi di

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

cioè qual è l'equivalente di mosh

screen -D -R

o forse

screen -wipe

Inoltre, dove è possibile trovare questa risposta nella documentazione?

Risposte:


197

Per motivi di sicurezza, non è possibile ricollegare, consultare https://github.com/keithw/mosh/issues/394

Per terminare la sessione disconnessa, utilizza il numero PID visualizzato in quel messaggio (è la parte 'XXXX'). Ad esempio, se vedi -

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

E può eseguire questo comando:

kill 12345

Inoltre, per chiudere tutte le connessioni di mosh è possibile:

kill `pidof mosh-server`

Nota che se sei attualmente connesso tramite mosh, anche quest'ultimo comando ti disconnetterà.


34
@artfulrobot Perché c'è una possibilità che la sessione separata appartenga a un client mosh ancora vivo da qualche parte. Le sessioni Mosh vagano e possono sopravvivere attraverso un ciclo di sospensione / ripresa (ad es. "Ibernazione"). Il problema che mosh non risolve (e non può facilmente) è rilevare che il computer client si è riavviato senza chiudere con grazia la sessione di mosh.
binki,

7
C'è un motivo per non killall mosh-serverinvece? Soprattutto perché pidof e killall sono comunque la stessa cosa.
Giordania,

6
@Jordan: su alcuni sistemi (Solaris, ad esempio), killallfa esattamente quello che dice.
In pausa fino a nuovo avviso.

4
Se sei connesso tramite mosh e corri killall mosh-server, verrai disconnesso.
0xcaff,

1
@ 0xcaff se ti connetti tramite mosh e corri kill `pidof mosh-server`verrai staccato ugualmente
David

26

Con mia grande sorpresa, ho usato CRIU ( https://criu.org ) per controllare e riavviare un client mosh e ha funzionato.

Scioccante.

Trova il PID del tuo mosh-client:

$ ps -ef | grep mosh

Quindi, installare CRIU secondo le loro istruzioni.

Quindi, checkpoint in questo modo:

Checkpoint $ mkdir

$ sudo ./criu dump -D checkpoint -t PID --shell-job

Quindi ripristinalo:

$ sudo ./criu restore -D checkpoint --shell-job

Ed eccolo qui. Il tuo client mosh è tornato.

Una cosa da notare, tuttavia, è che se il tuo laptop si riavvia (che è l'intero punto di ciò che stiamo cercando di proteggere), mosh utilizza un monotonicorologio per tenere traccia del tempo sul lato client, che non funziona attraverso i riavvii. Questo NON funzionerà, tuttavia, se il tuo laptop si arresta in modo anomalo, non funzionerà perché i numeri di sequenza di mosh non saranno sincronizzati con la versione che è stata controllata (il binario riprenderà, ma la comunicazione si interromperà).

Per risolvere questo problema, devi dire a mosh di smettere di farlo e scaricare il codice sorgente di mosh. Quindi, modifica questo file:

cd mosh

vim configure.ac

Quindi, cerca GETTIMEe commenta quella riga.

Quindi fa:

autoreconf # o ./autogen.sh se l'hai appena clonato per la prima volta

./configure

rendere

fare l'installazione

Successivamente, le sessioni client mosh con checkpoint CRIU sopravviveranno al riavvio.

(Ovviamente avresti bisogno di scrivere qualcosa per eseguire i checkpoint abbastanza regolarmente da essere utile. Ma, questo è un esercizio per il lettore).


1
Assicurati di digitare 'CTRL-L' per aggiornare l'output dello schermo dopo il ripristino.
Michael Galaxy,

6
Per pura curiosità, c'è un vantaggio pratico nel ripristinare la sessione client mosh che mi manca? Corro tmux su mosh e posso semplicemente riavviare mosh sul client e riconnettere tmux ... c'è un vantaggio nel fare questo oltre al suo figo (che è davvero!)?
eskhool,

1
La risposta lunga: github.com/mobile-shell/mosh/issues/394 La risposta breve è sì: non si dovrebbe aver bisogno di una sessione tmux se il demone mosh-server è già in esecuzione sul server di destinazione. Non solo lascia in giro demoni mosh penzolanti, ma è un'altra serie di sequenze di tasti che non dovremmo digitare in primo luogo.
Michael Galaxy,

1
Mosh è un sostituto (in alcuni casi) di SSH, non di schermo. quoth keithw (mosh autore) su github
törzsmókus

19

Mi rendo conto che questo è un vecchio post, ma esiste una soluzione molto semplice, come suggerito da Keith Winstein, mosh autore, qui: https://github.com/mobile-shell/mosh/issues/394

"Bene, prima di tutto, se vuoi la possibilità di collegarti a una sessione da più client (o dopo che il client muore), dovresti usare screen o tmux. Mosh è un sostituto (in alcuni casi) di SSH, non di screen. Molti utenti di Mosh lo usano insieme allo schermo e gli piace così ".

Scenario: ho effettuato l'accesso a un server remoto tramite mosh. Ho quindi eseguito lo schermo e ho un processo in esecuzione nella sessione dello schermo, htop, per esempio. Perdo la connessione (la batteria del laptop si spegne, si perde la connessione di rete, ecc.). Mi ricollego via mosh e ricevo quel messaggio sul server,

Mosh: hai una sessione Mosh distaccata su questo server (mosh [XXXX]).

Tutto quello che devo fare è uccidere la precedente sessione di mosh

uccidi XXXX

e ricollegarsi alla sessione dello schermo, che esiste ancora .

schermo -r

Ora, htop (o qualunque processo in esecuzione) è tornato così com'era senza interruzioni. Ciò è particolarmente utile per l'esecuzione di aggiornamenti o altri processi che lascerebbero il server in uno stato disordinato e sconosciuto se interrotto improvvisamente. Presumo che tu possa fare lo stesso con tmux, anche se non l'ho provato. Credo che questo sia ciò che Annihilannic ed eskhool stavano suggerendo.


2
Questa è un'ottima risposta Grazie e sì, ho confermato che funziona allo stesso modo con tmux.
laughing_man,

10

Come aggiunta alla risposta di Varta, uso il seguente comando per chiudere tutte le connessioni mosh tranne quella corrente:

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


Nel caso in cui non ci sia una vecchia sessione di mosh, xkill genererà un errore. Uso migliorepgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77,

4

Come sottolineato da @varta, i proprietari di mosh sono molto contrari al ricollegamento da diversi client per motivi di sicurezza. Quindi se il tuo client non c'è più (ad es. Hai riavviato il tuo laptop) l'unica opzione è quella di terminare le sessioni.

Per uccidere solo sessioni distaccate puoi usare la seguente riga (che ho come alias nella mia .bashrc).

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

Tale comando dipende dal fatto che whoelenca gli utenti connessi tra cui sessioni mosh, solo le sessioni mosh associate hanno "via mosh" e che le sessioni mosh hanno il loro pid tra parentesi quadre. Quindi trova i pid solo per le sessioni mosh distaccate e le passa per uccidere usando xargs.

Ecco un whorisultato di esempio per riferimento:

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

Un'alternativa è usare la variabile d'ambiente mosh-server MOSH_SERVER_SIGNAL_TMOUT. È possibile impostare a qualcosa come 300 nella tua .bashrcsul lato server . Quindi, se lo fai pkill -SIGUSER1 mosh-server, ucciderà solo i server mosh che non sono stati collegati negli ultimi 300 secondi (gli altri ignoreranno SIGUSER1). Maggiori informazioni nella pagina man di mosh-server . Sto usando il comando sopra perché, una volta alias, mi sembra più semplice.

Nota, come menzionato da @Annihilannic, se stai usando tmux / screen nelle tue sessioni mosh, quelle sessioni tmux / screen sono ancora presenti dopo che hai ucciso le sessioni mosh. Quindi puoi ancora attaccarti a loro (quindi non perdi molto uccidendo le stesse sessioni di mosh).


3

Le risposte qui affermando che uccidere mosh-serverè l'unica opzione sono in gran parte obsolete, in quanto possiamo usare criue reptyrrecuperare e ricollegare processi arbitrari.

Per non parlare del fatto che al giorno d'oggi possiamo kill -USR1 mosh-serveruccidere solo sessioni distaccate in modo pulito e sicuro, senza ricorrere a risultati non sicuri whoo comandi ingombranti per evitare di uccidere la nostra sessione.

Accanto alla criurisposta di Michael R. Hines, c'è un po 'più "leggero" reptyrche può essere usato per ricollegare i processi avviati mosh-server(cioè non lo mosh-serverstesso). Io di solito uso

pstree -p <mosh-server PID>

per elencare l'albero dei processi sotto il mosh-server distaccato e quindi

reptyr PID

per ricollegare il processo desiderato al mio terminale corrente. Dopo aver ripetuto la procedura per tutti i processi a cui tengo, I

kill -USR1 <mosh-server PID>

mentre mi occupo solo di uccidere le sessioni che conosco sono mie (sistema condiviso).


RicevoUnable to attach to pid 10103: Permission denied
rubo77 l'

-1

Utilizzare il comando ps per ottenere l'elenco delle attività in esecuzione o utilizzare ps -ef | grep mosh

Uccidi il mosh PID usando questo comando:

kill <pid>

Inoltre, per chiudere tutte le connessioni di mosh è possibile:

Nota che se sei attualmente connesso tramite mosh, anche questo ti disconnette

kill `pidof mosh-server`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.