¿Cómo puedo volver a conectarme a una sesión ssh después de una tubería rota?

21

Así que estaba ejecutando apt-get upgrade en un servidor cuando el enrutador decidió que había pasado demasiado tiempo desde la última vez que me enfadaron: abandonó toda conexión. La moraleja de la historia es usar screen mucho cuando estás en un enrutador bum.

De todos modos, volví a conectarme y me encontré con que el proceso todavía estaba pendiente, todavía esperando que mi Y / n se actualizara (todavía no lo había logrado, por suerte). ¿Hay alguna manera de volver a conectarme a una sesión interrumpida? Terminé matándolo, ya que no estaba en el medio de la administración de paquetes, pero sería genial saberlo para referencia futura.

    
pregunta hexafraction 22.09.2012 - 03:49

3 respuestas

14

La respuesta a tu pregunta correcta es: no puedes . Creo que el problema principal es que los procedimientos de autenticación no estarán sincronizados. Simplemente no funciona así.

Como usted mismo notó, la solución es usar la pantalla cuando sea posible (por cierto, tmux es una alternativa a la pantalla) .

    
respondido por el January 28.09.2012 - 10:11
8

Para ejecutar procesos de larga duración, uso pantalla , o byobu si quieres una interfaz más amigable.

Para la pantalla, puede usar:

screen [program] [args]

Esto ejecutará [program] y su [args] dentro de una sesión de pantalla . Una vez que el programa finaliza, la sesión se cierra automáticamente. Si desea mantener la sesión después de que se ejecute su programa, simplemente ejecute pantalla sin ningún argumento y aparecerá un nuevo mensaje dentro de la sesión. CTRL + A + D separa el terminal de la sesión actual.

Volver a adjuntar a una sesión anterior:

screen -r

Si solo hay una sesión abierta, se volverá a conectar inmediatamente. Si hay varias sesiones en curso, le preguntará a cuál desea adjuntar. Si conoce el nombre de la sesión, puede agregarlo como argumento a esta línea de comando.

Byobu es una buena mejora. Se basa en la pantalla , pero proporciona una barra en la parte inferior que muestra todas las sesiones actuales como pestañas y proporciona accesos directos más fáciles para moverse por ellas. Usted puede:

  • F2 comienza una nueva sesión
  • F3 pasa a la pestaña de la siguiente sesión a la izquierda
  • F4 pasa a la pestaña de la siguiente sesión a la derecha
  • F8 da un nombre descriptivo a la pestaña de la sesión actual
  • F9 abre un menú de opciones
  • CTRL + A + D separa todas las sesiones de la terminal.

WORD OF ADVICE : evite dejar una sesión abierta con el usuario root . Si alguien obtiene acceso a su terminal (local o remotamente), pueden volver a conectarse fácilmente a una sesión en curso y usar su sistema como root. Si es necesario, es mejor iniciar una sesión usando un usuario común y sudo líneas de comando indivuduales según sea necesario.

    
respondido por el JulioHM 27.09.2012 - 21:44
5

Si bien no puede volver a conectarse a una sesión SSH interrumpida, puede reparar el proceso que se ejecuta en el interior, funcionalmente equivalente a lo que desea.

En su caso, asumiría el control del proceso apt-get para ser controlado desde una nueva sesión SSH, screen sesión o similar. Mi favorito para esto es el comando reptyr :

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

Luego, con el pid que encontraste para tu proceso:

$ reptyr 10626

Después de esta etapa, toda la información del teclado va al programa que tomaste. Lamentablemente, no verá la salida anterior de la sesión SSH, como el resultado de apt-get que le solicita confirmación.

Hay muchas otras herramientas que básicamente funcionan igual que reptyr (es decir, a través de ptrace adjunto de depuración). Vea las siguientes preguntas y respuestas donde se discuten:

(Detalles: la razón por la que no puede hacerse cargo de una sesión SSH de esta forma es porque un proceso de sshd no está controlado por un terminal de host, sino que proporciona la parte esclava de un terminal - un dispositivo pts - mientras que la parte maestra que lo controla reside en la máquina cliente, aquí con una sesión SSH desglosada en medio. Cuando fuerzas la toma de control de dicho proceso sshd con reptyr -s <pid> , tu entrada de teclado se va a ese proceso, no a su proceso hijo activo. Por lo tanto, una "Ctrl + Z" simplemente matará ese sshd .)

    
respondido por el tanius 16.02.2017 - 14:12

Lea otras preguntas en las etiquetas