GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo desconectar la sesión ssh sin matar un proceso en ejecución?

Usar

Ctrl-Z

para pausar la aplicación y volver a la línea de comandos. Entonces usa

bg

para permitir que el proceso continúe en segundo plano. Finalmente use

disown

Para que el proceso no se cierre cuando desconectes tu sesión y cierres tu terminal.

El proceso continuará ejecutándose, pero no hay forma de 'volver a conectar' a la terminal para ver el resultado que conozco si se vuelve a conectar a una nueva sesión.


Usar reptyr

Este es exactamente el caso man 1 reptyr menciona explícitamente:

reptyr es una utilidad para tomar un programa en ejecución existente y adjuntarlo a una nueva terminal. ¿Comenzó un proceso de larga duración a través de ssh, pero tiene que salir y no quiere interrumpirlo? Simplemente comience un screen , usa reptyr para agarrarlo, y luego matar la sesión ssh y volver a casa.

(El manual menciona screen , puedes usar tmux en su lugar, lo que prefieras).

No te pierdas esta nota:

reptyr depende del ptrace(2) llamada al sistema para adjuntar al programa remoto. En Ubuntu Maverick y superior, esta capacidad está desactivada de forma predeterminada por motivos de seguridad. Puede habilitarlo temporalmente haciendo

echo 0 > /proc/sys/kernel/yama/ptrace_scope

como root, o permanentemente editando el archivo /etc/sysctl.d/10-ptrace.conf , que también contiene más información sobre esta configuración.

Si el archivo no existe pero el /etc/sysctl.d/ directorio lo hace, entonces probablemente sea suficiente para crearlo con el siguiente contenido:

kernel.yama.ptrace_scope = 0

La configuración se aplicará en el próximo reinicio. Consulte las consideraciones de seguridad a continuación.

Uso básico

El uso básico es simple:

reptyr PID

donde PID es el PID del proceso que desea adjuntar a una nueva terminal. Nota reptyr solo adjunta un proceso a otra terminal. Esto no significa que el proceso se convierta en un elemento secundario del nuevo shell.

Consideraciones de seguridad

Ajuste ptrace_scope como 0 no se recomienda.

A medida que Linux crece en popularidad, se convertirá en un objetivo más importante para el malware. Una debilidad particularmente preocupante de las interfaces de proceso de Linux es que un solo usuario puede examinar la memoria y el estado de ejecución de cualquiera de sus procesos. Por ejemplo, si una aplicación (p. ej., Pidgin) se vio comprometida, un atacante podría conectarse a otros procesos en ejecución (p. ej., Firefox, sesiones SSH, agente GPG, etc.) para extraer credenciales adicionales y continuar ampliando el alcance de su ataque sin recurrir al phishing asistido por el usuario.

Este no es un problema teórico. Los ataques de secuestro de sesión SSH (http://www.storm.net.nz/projects/7) e inyección de código arbitrario (http://c-skills.blogspot.com/2007/05/injectso.html) ya existen y continúan posible si ptrace se le permite operar como antes. Desde ptrace no es comúnmente utilizado por personas que no son desarrolladores ni administradores, los creadores de sistemas deben tener la opción de deshabilitar este sistema de depuración.

[…]

La configuración de sysctl (solo se puede escribir con CAP_SYS_PTRACE ) son:

0 - clásico ptrace permisos:un proceso puede PTRACE_ATTACH a cualquier otro proceso que se ejecute bajo el mismo uid, siempre que sea volcable […]

1 - restringido ptrace :un proceso debe tener una relación predefinida con el inferior al que quiere llamar PTRACE_ATTACH en. Por defecto, esta relación es la de sólo sus descendientes cuando también se cumple el criterio clásico anterior. […]

2 - Adjuntar solo para administradores:solo procesos con CAP_SYS_PTRACE puede usar ptrace con PTRACE_ATTACH , o a través de niños llamando al PTRACE_TRACEME .

3 - no adjuntar:ningún proceso puede usar ptrace con PTRACE_ATTACH ni a través de PTRACE_TRACEME . Una vez establecido, este valor de sysctl no se puede cambiar.

Un enfoque razonable es establecer ptrace_scope a 2 y luego permitir reptyr usar ptrace :

echo 2 | sudo tee /proc/sys/kernel/yama/ptrace_scope
sudo setcap CAP_SYS_PTRACE+pe /usr/bin/reptyr

No se olvide del archivo que contiene la configuración permanente.

Las capacidades se almacenan en el inodo del archivo. Por lo tanto, no me sorprendería si reptyr pierde la capacidad cuando se actualiza (reemplazado atómicamente por un nuevo ejecutable).


Puede desasociar totalmente un comando (en bash o zsh , posiblemente otros shells) con el disown dominio. Sin embargo, es posible que el comando no esté contento con esto si requiere un tty, en cuyo caso, consulte el reptyr respuesta.

$ ssh somecentos7system
-bash-4.2$ sleep 252727
^Z
[1]+  Stopped                 sleep 252727
-bash-4.2$ bg
[1]+ sleep 252727 &
-bash-4.2$ disown
-bash-4.2$ logout
Connection to somecentos7system closed.
$ ssh somecentos7system
-bash-4.2$ pgrep -lf 252727
20089 sleep
-bash-4.2$ 

Otra opción es hacer que una sesión de pantalla (o tmux) se inicie automáticamente para que no se olvide de iniciar una porque ya se inició porque usted configuró las cosas de esa manera. Hay otras publicaciones en otros lugares sobre cómo hacerlo.


Linux
  1. ¿Cómo terminar la conexión SSH que no responde en Linux?

  2. Ssh:¿cómo rechazar un proceso en ejecución y asociarlo a un nuevo shell de pantalla?

  3. ¿Cómo detener un proceso de pantalla en Linux?

  4. ¿Cómo matar un proceso que se ejecuta en un puerto particular en Linux?

  5. ¿Cómo fuerzo la separación de Screen de otra sesión SSH?

Cómo enumerar los procesos en ejecución en Linux

Reptyr:mueva un proceso en ejecución de una terminal a otra sin cerrarlo

Cómo matar el proceso de ejecución de Linux en un puerto particular

¿Cómo verifico la sintaxis de un script Bash sin ejecutarlo?

¿Cómo copiar un archivo sin usar scp dentro de una sesión ssh?

¿Cómo adjunto una terminal a un proceso desconectado?