Cómo reconectarse a una sesión ssh desconectada

157

¿Hay alguna manera de conectarse a una sesión ssh que se desconectó? Estamos teniendo problemas con nuestra conexión de red a un sitio remoto en el que estamos trabajando por separado; sin embargo, mientras tanto experimentamos una gran cantidad de desconexiones debido a la pérdida de paquetes mientras estamos conectados a servidores en la ubicación remota. Muchas veces la sesión permanece activa por un tiempo, y a veces sucede que está en medio de alguna acción (edición de archivos, ejecución de algún proceso, etc.) a la que necesito volver en lugar de reiniciar si es posible.

caballo pálido
fuente
10
No puedo creer que nadie haya mencionado mosh.mit.edu
jwbensley
@javano: nunca he oído hablar de eso. ¡Agregue eso como respuesta!
kbyrd
@kbyrd Have done;)
jwbensley
una pregunta similar se le preguntó en unix.stackexchange.com/questions/105001/... con algunos consejos sobre cómo evitar las desconexiones en el primer lugar ...
anarcat

Respuestas:

136

ACTUALIZACIÓN: para obtener una respuesta real, consulte la respuesta de zero_r a continuación

Esta no es una respuesta, sino una solución alternativa. Usar pantalla .

Cuando inicie sesión por primera vez, ejecute la pantalla. Obtienes otro shell, ejecutas comandos en eso. Si está desconectado, el proceso de la pantalla mantiene vivo el terminal para que su shell y los procesos que está ejecutando no se caigan. Cuando vuelva a conectarse, ejecute 'screen -r' para reanudar.

Hay mucho más para configurar y usar la pantalla, pero lo anterior debería solucionar su problema.

kbyrd
fuente
18
O use tmux, una pantalla 'más fresca', he usado ambos y prefiero tmux porque puede dividir el término muy bien.
John Hunt
3
Me alegró descubrir que screenya estaba instalado en mi Ubuntu 12.x, así que si no está seguro, simplemente intente este comando, se reconectó y reanudó el proceso do-release-upgrade : sudo screen -D -r
bjm88
1
@ bjm88, sudodebe usarse solo si la sesión de pantalla original se inició con sudo. De lo contrario, volverá como si no existiera una sesión de pantalla:There is no screen to be detached
Noam Manos
+1 Me doy cuenta de que esta no es la respuesta real; Sin embargo, screen -rera exactamente lo que estaba buscando.
Eric Nelson
130

Intente configurar ClientAliveInterval (por ejemplo, 60) y TCPKeepAlive (sí o no) a los valores apropiados en el servidor sshd.conf.

Esto debería mantener viva su sesión incluso si la conexión se pierde por minutos.

cero_r
fuente
24
Hasta ahora, parece ser el único que realmente responde la pregunta en lugar de sugerir la pantalla como solución alternativa.
kbyrd
2
Buena llamada. Hemos encontrado que este método es particularmente útil al atravesar firewalls Cisco ASA / PIX, que por defecto aman agotar las conexiones TCP.
Mike Pountney
55
Quizás este no sea el lugar correcto para preguntar, pero ¿es posible que el afiche cambie las respuestas? Deberíamos responder la 'pantalla' (la mía no es la mejor, me gusta la de Mike Pountney, pero obtuve el representante) con esta información.
kbyrd
1
¿Funcionará cuando se conecte a través de una conexión VPN de Cisco y la conexión VPN se pierda y se restablezca?
Brent
para mí la pantalla funciona perfectamente, puedo volver a conectarme a la tarea seleccionada y contar para que funcione
integratorIT
65

Como se mencionó anteriormente, GNU Screen es el camino a seguir. Le permitirá tener una 'sesión de pantalla' en la caja remota en la que puede ejecutar múltiples comandos, a través de múltiples 'ventanas de pantalla'. Esto simplemente se desconectará si la conexión SSH de su padre se corta, manteniendo todos los subprocesos funcionando dentro de ella.

' man screen' es su amigo como siempre, y el paquete del sistema operativo debería llamarse ' screen' si no está instalado de manera predeterminada.

Los conceptos básicos son:

  • Inicie una sesión de pantalla (en su host remoto):

    $ screen
    
  • Desconectarse de la sesión de pantalla: CTRL-A,d

  • Vuelva a conectarse a su sesión de pantalla después de volver a iniciar sesión:

    $ screen -d -r
    
  • Abrir otra pantalla de 'ventana': CTRL-A,c

  • Ciclo a través de ustedes ventanas de la pantalla abierta: CTRL-A,space

Hay muchas cosas geniales que puedes hacer con Screen. Lo he estado usando durante más de 10 años y todavía estoy descubriendo nuevas características. Es mi utilidad favorita de Unix.

Mike Pountney
fuente
1
Sí, esta es una respuesta mucho mejor que la mía.
kbyrd
¿Puedo conectarme a la sesión ssh desconectada si reinicio mi PC donde se está ejecutando la pantalla?
BarathVutukuri
tmux es más poderoso
Pegasus
46

No puedo creer que nadie haya mencionado a MOSH ;

Mosh es un protocolo separado que puede conectarse al proceso de inicio de sesión SSH, mantiene viva su sesión después de días de desconexión, cambio de IP, alta latencia, etc. Se explica en la página de inicio mejor de lo que puedo explicarlo, así que he copiado la descripción a continuación. Mis experiencias y consejos son que lo uso en mi móvil Android, es un salvavidas cuando viajo y hago SSH. Lo mismo es cierto en mi computadora portátil cuando, por ejemplo, atado al móvil en el tren. Recomiendo compilar desde la fuente para obtener la última versión, la versión de repositorio para mí dentro de Ubuntu tiene algunas molestias que se corrigen en la versión más reciente (en el momento de la redacción).

Mosh (carcasa móvil)

Aplicación de terminal remota que permite la itinerancia, admite conectividad intermitente y proporciona eco local inteligente y edición de línea de las pulsaciones de teclas del usuario.

Mosh es un reemplazo para SSH. Es más robusto y receptivo, especialmente a través de Wi-Fi, celulares y enlaces de larga distancia.

Mosh es un software gratuito, disponible para GNU / Linux, FreeBSD, Solaris, Mac OS X y Android.

Características del sitio web:

  • Cambiar IP. Mantente conectado : Mosh deambula automáticamente mientras te mueves entre las conexiones a Internet. Utilice Wi-Fi en el tren, Ethernet en un hotel y LTE en una playa: permanecerá conectado. La mayoría de los programas de red pierden sus conexiones después del roaming, incluidas las aplicaciones SSH y web como Gmail. Mosh es diferente.

  • Hace dulces sueños : con Mosh, puede poner su computadora portátil en reposo y despertarla más tarde, manteniendo su conexión intacta. Si su conexión a Internet se cae, Mosh le avisará, pero la conexión se reanudará cuando vuelva el servicio de red.

  • Deshágase del retraso de la red : SSH espera la respuesta del servidor antes de mostrarle su propia escritura. Eso puede crear una interfaz de usuario pésima. Mosh es diferente: da una respuesta instantánea a escribir, eliminar y editar líneas. Lo hace de forma adaptativa y funciona incluso en programas de pantalla completa como emacs y vim. En una mala conexión, las predicciones pendientes están subrayadas para que no se engañe.

  • Sin código privilegiado. No daemon : no necesitas ser el superusuario para instalar o ejecutar Mosh. El cliente y el servidor son ejecutables ejecutados por un usuario común y solo duran la vida de la conexión.

  • Mismo método de inicio de sesión : Mosh no escucha en los puertos de red ni autentica a los usuarios. El cliente mosh inicia sesión en el servidor a través de SSH, y los usuarios presentan las mismas credenciales (por ejemplo, contraseña, clave pública) que antes. Luego, Mosh ejecuta el servidor mosh de forma remota y se conecta a él a través de UDP.

  • Se ejecuta dentro de su terminal, pero mejor : Mosh es un programa de línea de comandos, como ssh. Puede usarlo dentro de xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen o tmux. Pero mosh fue diseñado desde cero y solo admite un conjunto de caracteres: UTF-8. Soluciona errores Unicode en otros terminales y en SSH.

  • Control-C funciona muy bien : a diferencia de SSH, el protocolo basado en UDP de mosh maneja la pérdida de paquetes con gracia y establece la velocidad de fotogramas según las condiciones de la red. Mosh no llena los buffers de red, por lo que Control-C
    siempre trabaja para detener un proceso desbocado.

jwbensley
fuente
8
Mosh no es un contenedor ssh: es un protocolo diferente, casi completamente ajeno a ssh (solo usa ssh para iniciar sesión).
jch
+1 Muy cierto, mi error.
jwbensley
2
¿Qué pasa con la seguridad, hombre en el medio? cifrado? intercambio de llaves ?
Nasir Iqbal
Mosh se ve impresionante, aunque por desgracia no admite el reenvío de puertos todavía .
Boann el
20

autossh vigila su conexión y si se cae, se vuelve a conectar. Es más confiable que keepalives. Si se conecta a una sesión de pantalla, continuará desde donde se desconectó (vea rscreenque viene con autossh)

hayalci
fuente
1
fuera de un keep-alive configurable, inherentemente no le permite volver a conectarse a una sesión (lo que estaba buscando el OP). pero autossh puede ser realmente útil para aplicaciones que requieren túneles ssh, mapeo de puertos, etc.
ives
sí, autossh + screen sería el punto ideal. Autossh tiene rscreenpara esto.
hayalci
Autossh es mejor que mosh. He usado los dos.
Sridhar Sarnobat
Aquí hay una publicación de blog de Jesse Keating, sobre el uso de autossh con pantalla .
sampablokuper
12

tmux

Esto es un clásico. Úselo siempre que corra el riesgo de perder la conexión a un terminal.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Solo así, estás de vuelta en acción.

Jacksonkr
fuente
¡Gracias una tonelada! Estaba buscando cómo hacer esto con tmux, ya que eso parece ser lo que la mayoría de la gente considera como la mejor opción.
CoolOppo
10

Instalaría e iniciaría la pantalla para solucionar su problema. La pantalla le permitirá volver a conectarse a una sesión de pantalla anterior.

Aparte de eso, la pantalla también te permite hacer cosas interesantes como dividir tu pantalla, ver la consola, etc. Puedes encontrar más información aquí y aquí .

Para empezar, si te desconectas, puedes usar

screen -ls

para ver tus sesiones y

screen -r ${session} 

para volver a conectar a uno desconectado.

wzzrd
fuente
4

Como otros han señalado, la pantalla es generalmente la mejor solución para esto y también agrega una serie de otras características útiles.

Puede configurar su perfil en la máquina remota para que se inicie y / o vuelva a conectar automáticamente a la pantalla al iniciar sesión, lo que le ahorra el olvido de iniciar la pantalla la única vez que la necesita porque sufre una caída de la conexión.

Consulte http://tlug.dnho.net/?q=node/239 (o busque en Google muchos otros ejemplos de formas ligeramente diferentes).

David Spillett
fuente
3

una alternativa más moderna a la pantalla, por desgracia, no está disponible para algunos tipos de "virtualización" (por ejemplo, en cygwin puede tener "pantalla", pero no "tmux" debido a la forma en que está diseñada), pero donde tenga la opción de instalar tmux , Recomiendo encarecidamente optar por esa pantalla.

cepal
fuente
3

Aquí hay otra solución que no es de pantalla.

La bandeja de masilla le permite hacer exactamente eso, tiene una opción de reconexión en desconexión que no está en regular o masilla

https://puttytray.goeswhere.com/

es una bifurcación de masilla (de código abierto) con otras opciones, vaya a la configuración de conexión y hay 2 opciones, una para 'intentar reconectarse en caso de falla de conexión' e 'intentar reconectarse al inicio'.

munkiepus
fuente
1
Ehh ¿Viene con un keylogger y una utilidad automática de exfiltración de ppk, por casualidad?
Deer Hunter
1
Supongo que está preguntando si de alguna manera, roba sus datos, es completamente de código abierto, el código fuente está disponible en github si desea ver su github.com/FauxFaux/PuTTYTray hay bastantes contribuyentes: )
munkiepus
grandes saludos :)
munkiepus
2

Si bien la pantalla mantendrá su sesión de shell abierta en el servidor remoto si su sesión ssh cae, no hará nada sobre el problema de las conexiones ssh que se caen. Como zero_r sugiere, intente ajustar su conexión ssh con keep alives y largos tiempos de espera.

Le sugiero que rastree la causa de los paquetes perdidos que causan los problemas y solucione eso en lugar de solucionarlo.

David
fuente
Gracias por la sugerencia. Estamos trabajando para rastrear el problema raíz de la pérdida de paquetes, simplemente está tomando un tiempo resolverlo (¡muy complicado, este!). Esto realmente es una solución para este período de problemas. Uno nunca sabe cuándo algo causará una conexión caída.
palehorse
1
Generará mucho ruido, pero puede intentar ejecutar ssh a través de strace y ver qué hace / informa cuando se corta la conexión ssh. Sólo podría informar de lo que ya sabe, pero quién sabe ...
David
1

A veces también me olvidé de ejecutar la pantalla y perder mi trabajo inacabado. En este caso, aunque no podemos volver a conectarnos a una sesión SSH interrumpida, volver a enviar un programa en ejecución a un nuevo terminal y reanudar lo que estaba haciendo aún es posible gracias a reptyr.

Después de desconectarse accidentalmente de una sesión SSH, lo primero es ejecutarlo screenpara que la conexión no se vuelva a romper. Luego, en la nueva sesión, ejecute ps aux | grep {The process to be resumed}para obtener el PID. Con el PID, puede intentar reptyr {PID}o reptyr -T {PID}(si hay subprocesos) continuar el trabajo.

marcha_feliz
fuente