Cómo matar la session SSH que se inició con la opción -f (se ejecuta en segundo plano)

Estoy bastante perdido en esto. Desde la página man:

-f Requests ssh to go to background just before command execution. 

Después de iniciar SSH con la opción -f , tengo un túnel en funcionamiento. Pero después de que termine de usarlo, no sé cómo seguir interactuando con él. Por ejemplo, no puedo cerrar el túnel SSH cuando termino con él.

Los methods habituales que conozco no funcionan. Por ejemplo, jobs no devuelve nada. El command ~ no se reconoce (y, de todos modos, no sé exactamente cómo usarlo).

Sin embargo, pgrep me dice que el túnel SSH todavía está en funcionamiento (después de haber cerrado la terminal, etc.). ¿Cómo interactúo? ¿Cómo lo cierro?

Una solución especialmente buena para los scripts es usar el modo "maestro", con un socket para los commands de control:

 ssh -f -N -M -S <path-to-socket> -L <post>:<host>:<port> <server> 

Para cerrarlo de nuevo:

 ssh -S <path-to-socket> -O exit <server> 

Esto evita tanto el almacenamiento para los identificadores de process como cualquier problema de time que pueda estar asociado con otros enfoques.

Encontré la solución aquí: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

La mejor manera – Túneles que se cierran automáticamente

Como se ha mencionado anteriormente, en lugar de utilizar la combinación de conmutadores -f -N, podemos usar -f solo, pero también ejecutar un command en la máquina remota. Pero, ¿qué command debería ejecutarse, ya que solo necesitamos inicializar un túnel?

¡Aquí es cuando el sueño puede ser el command más útil de todos! En esta situación particular, dormir tiene dos ventajas:

  • no hace nada, por lo que no se consumen resources
  • el usuario puede especificar por cuánto time será ejecutado

La forma en que estos ayudan a cerrar automáticamente el túnel ssh se explica a continuación.

Comenzamos la session ssh en segundo plano, mientras ejecutamos el command sleep durante 10 segundos en la máquina remota. La cantidad de segundos no es crucial. Al mismo time, ejecutamos vncviewer exactamente como antes:

 [me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \ vncviewer 127.0.0.1:25901:1 

En este caso, el cliente ssh recibe instrucciones para bifurcar la session ssh al background (-f), crear el túnel (-L 25901: 127.0.0.1: 5901) y ejecutar el command dormir en el server remoto durante 10 segundos (dormir 10).

La diferencia entre este método y el anterior (-N switch), básicamente, es que en este caso el objective principal del cliente ssh no es crear el túnel, sino ejecutar el command sleep durante 10 segundos. La creación del túnel es una especie de efecto secundario, un objective secundario. Si no se utilizaba vncviewer, el cliente ssh saldría después del período de 10 segundos, ya que no tendría más trabajos que hacer, destruyendo el túnel al mismo time.

Durante la ejecución del command sleep, si otro process, vncviewer en este caso, comienza a usar ese túnel y lo mantiene ocupado más allá del período de 10 segundos, entonces, incluso si el cliente ssh finaliza su trabajo remoto (ejecución de suspensión), no puede salir porque otro process ocupa el túnel. En otras palabras, el cliente ssh no puede destruir el túnel porque también tendría que matar a vncviewer. Cuando vncviewer deja de usar el túnel, el cliente ssh también sale, ya que ya ha logrado su objective.

De esta forma, ningún process ssh quedará ejecutándose en segundo plano.

Para matar el túnel, use ps -C ssh o ps | grep ssh ps | grep ssh o cualquier otra variante para determinar qué process ssh está ejecutando su túnel. Entonces mátalo.

Alternativamente, puede search el process determinando cuál tiene este puerto abierto:

 netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}' 

Si quiere matar a todos los clientes ssh que se ejecutan en su máquina (como su usuario), pkill ssh lo hará.

Como respondieron otros aquí, pkill ssh mata.

Para crear un túnel que pueda traer de vuelta, lo comienzo en la screen sin la opción -f , y luego separe la pantalla con Ctrl-A D Para recuperar el túnel, llame al screen -r .