ssh - protocolo - ¿Cómo me vuelvo a conectar a una sesión separada de mosh?
ssh protocolo (5)
¿Cómo me vuelvo a conectar a una sesión mosh separada o de lo contrario me deshago de
Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
es decir, ¿cuál es el equivalente mosh de
screen -D -R
o posiblemente
screen -wipe
Además, ¿dónde se puede encontrar esta respuesta en la documentación?
Como señaló @varta, los propietarios de mosh están muy en contra de volver a unirse de diferentes clientes por razones de seguridad. Entonces, si su cliente se ha ido (por ejemplo, ha reiniciado su computadora portátil) su única opción es eliminar las sesiones.
Para matar solo las sesiones separadas, puedes usar la siguiente línea (que tengo como alias en mi .bashrc
).
who | grep -v ''via mosh'' | grep -oP ''(?<=mosh /[)(/d+)(?=/])'' | xargs kill
Ese comando depende del hecho de que who
enumera los usuarios conectados, incluidas las sesiones mosh, solo las sesiones mosh adjuntas tienen "vía mosh", y que las sesiones mosh tienen sus pid entre corchetes. Así que encuentra las preguntas para las sesiones de mosh separadas y las pasa a matar usando xargs.
Aquí hay un ejemplo who
resulta para referencia:
$ 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)
Una alternativa es usar la variable de entorno MOSH_SERVER_SIGNAL_TMOUT
. Puede establecerlo en 300 .bashrc
en su .bashrc
. Entonces, si haces un pkill -SIGUSER1 mosh-server
, solo matará mosh-servers que no han sido conectados en los últimos 300 segundos (los otros ignorarán al SIGUSER1). Más información en la página man de mosh-server . Estoy usando el comando de arriba porque, una vez que tengo un alias, me parece más simple.
Tenga en cuenta que, como lo menciona @Annihilannic, si está utilizando tmux / screen dentro de sus sesiones mosh entonces esas sesiones de tmux / pantalla todavía están presentes después de matar a las sesiones de mosh. Así que aún puedes unirlos (así que realmente no pierdes mucho matando las sesiones de mosh).
Como una adición a la respuesta de Varta, utilizo el siguiente comando para cerrar todas las conexiones de mosh, excepto la actual:
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill
Me doy cuenta de que esta es una publicación anterior, pero hay una solución muy simple para esto, como lo sugirió Keith Winstein, autor principal, aquí: github.com/mobile-shell/mosh/issues/394
"Bueno, primero, si quieres tener la posibilidad de conectarte a una sesión de varios clientes (o después de que el cliente muera), debes usar screen o tmux. Mosh es un sustituto (en algunos casos) para SSH, no para pantalla. Muchos usuarios de Mosh lo usan junto con la pantalla y les gusta de esa manera ".
Escenario: estoy conectado a un servidor remoto a través de mosh. Luego ejecuté la pantalla y ejecuté un proceso en la sesión de la pantalla, htop, por ejemplo. Pierdo la conexión (la batería del portátil se muere, pierdo la conexión de red, etc.). Me conecto de nuevo a través de mosh y obtengo ese mensaje en el servidor,
Mosh: Tienes una sesión separada de Mosh en este servidor (mosh [XXXX]).
Todo lo que tengo que hacer es matar a la sesión mosh anterior
matar a XXXX
y volver a conectar a la sesión de pantalla, que todavía existe .
pantalla -r
Ahora, htop (o el proceso que se estaba ejecutando) ha regresado tal como estaba sin interrupción. Esto es especialmente útil para ejecutar actualizaciones u otros procesos que dejarían el servidor en un estado desordenado y desconocido si se interrumpiera repentinamente. Supongo que puedes hacer lo mismo con tmux, aunque no lo he intentado. Creo que esto es lo que sugieren Annihilannic y Eskhool.
Para mi asombro, utilicé CRIU ( https://criu.org ) en el punto de control y reinicié un cliente mosh y funcionó.
Chocante.
Encuentra el PID de tu mosh-client:
$ ps -ef | grep mosh
Luego, instale CRIU según sus instrucciones.
Entonces, punto de control así:
$ mkdir checkpoint
$ sudo ./criu dump -D checkpoint -t PID --shell-job
Entonces, restaurarlo:
$ sudo ./criu restore -D checkpoint --shell-job
Y ahí está. Tu cliente mosh ha vuelto.
Una cosa a tener en cuenta, sin embargo, es que si su computadora portátil se reinicia (que es el objetivo de lo que estamos tratando de proteger), mosh usa un reloj monotonic
para rastrear el tiempo en el lado del cliente, que no funciona en reinicios . Esto NO funcionará, sin embargo, si su computadora portátil se cuelga, no funcionará porque los números de secuencia de mosh no estarán sincronizados con la versión marcada (el binario se reanudará pero la comunicación se detendrá).
Para arreglar esto, necesitas decirle a mosh que deje de hacer eso y descargar el código fuente de mosh. Luego, edita este archivo:
cd mosh
vim configure.ac
Luego, busca GETTIME
y comenta esa línea.
Entonces hazlo:
autoreconf # o ./autogen.sh si acaba de clonarlo por primera vez
./configure
hacer
hacer la instalación
Después de eso, las sesiones de cliente mosh con control de CRIU sobrevivirán al reinicio.
(Obviamente necesitarías escribir algo para realizar los puntos de control con la frecuencia suficiente como para ser útil. Pero eso es un ejercicio para el lector).
Por razones de seguridad, no puede volver a conectarse, consulte https://github.com/keithw/mosh/issues/394
Para matar la sesión separada, use el número PID que se muestra en ese mensaje (esa es la parte ''XXXX''). Por ejemplo, si ve -
Mosh: You have a detached Mosh session on this server (mosh [12345]).
Y puede ejecutar este comando:
kill 12345
Además, para cerrar todas las conexiones Mosh puedes:
kill `pidof mosh-server`
Tenga en cuenta que si actualmente está conectado a través de mosh, este último comando también lo desconectará.