Estoy bastante perdido en esto. Desde la página del manual:
-f Requests ssh to go to background just before command execution.
Después de comenzar SSH con la -f
opción, tengo un túnel en funcionamiento. Pero después de terminar de usarlo, no sé cómo seguir interactuando con él. Por ejemplo, no puedo cerrar el túnel SSH cuando termino con él.
Los métodos habituales que conozco no funcionan. Por ejemplo, jobs
no devuelve nada. El ~
comando no se reconoce (y no sé exactamente cómo usarlo, de todos modos).
Sin embargo, pgrep
me dice que el túnel SSH todavía está funcionando (después de haber cerrado la terminal, etc.). ¿Cómo interactúo con él? ¿Cómo lo cierro?
fuente
/tmp/session1
(Aunque se recomienda nombrarlo usando % patterns - consulte la descripción de ControlPath enman ssh_config
)ssh -S <path-to-socket> -O exit <server>
comando puede ser cualquier cadena, pero debe estar presente. Eso es un poco torpe.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 usar la combinación de conmutadores -f -N, podemos usar -f solo, pero también ejecutar un comando en la máquina remota. Pero, ¿qué comando debe ejecutarse, ya que solo necesitamos inicializar un túnel?
¡Aquí es cuando dormir puede ser el comando más útil de todos! En esta situación particular, dormir tiene dos ventajas:
A continuación, se explica cómo estos ayudan a cerrar automáticamente el túnel ssh.
Comenzamos la sesión ssh en segundo plano, mientras ejecutamos el comando de suspensión durante 10 segundos en la máquina remota. El número de segundos no es crucial. Al mismo tiempo, ejecutamos vncviewer exactamente como antes:
En este caso, se le indica al cliente ssh que bifurque la sesión ssh en segundo plano (-f), cree el túnel (-L 25901: 127.0.0.1: 5901) y ejecute el comando de suspensión en el servidor remoto durante 10 segundos (suspensión 10)
La diferencia entre este método y el anterior (-N switch), básicamente, es que en este caso el objetivo principal del cliente ssh no es crear el túnel, sino más bien ejecutar el comando de suspensión durante 10 segundos. La creación del túnel es una especie de efecto secundario, un objetivo secundario. Si no se usó 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 tiempo.
Durante la ejecución del comando de suspensión, si otro proceso, 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 proceso 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 se cierra, ya que ya ha logrado su objetivo.
De esta manera, no quedan procesos ssh ejecutándose en segundo plano.
fuente
vncviewer 127.0.0.1::25091
ya que está utilizando la sintaxis del puerto y no la sintaxis de la pantalla.Para matar el túnel, use
ps -C ssh
ops | grep ssh
cualquier otra variante para determinar qué proceso ssh está ejecutando su túnel. Entonces mátalo.Alternativamente, puede buscar el proceso determinando cuál tiene este puerto abierto:
Si desea matar a todos los clientes ssh que se ejecutan en su máquina (como su usuario),
pkill ssh
lo hará.fuente
Como respondieron otros aquí, lo
pkill ssh
mata.Para crear un túnel que pueda recuperarse, lo inicio
screen
sin la-f
opción y luego desconecto la pantalla conCtrl-A D
. Para traer de vuelta el túnel, llamescreen -r
.fuente
screen
.Cuando comienzo un túnel con:
-f
Solicita a ssh que vaya al fondo justo antes de la ejecución del comando.-N
No ejecute un comando remoto. Esto es útil solo para reenviar puertos.-D
Especifica un reenvío de puerto a nivel de aplicación "dinámico" local.-l
Especifica el usuario para iniciar sesión como en la máquina remota.Puedo cerrarlo con:
fuente
La mejor solución que encontré para matar todos los túneles en una línea de comando es
ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill
para las sesiones ssh, simplemente elimine la opción de túnel
ps -lef|grep ssh|awk '{print $4}'|xargs kill
fuente