¿Cómo cerrar este túnel ssh? [cerrado]

96

Abrí un túnel ssh como se describe en esta publicación: Zend_Db: ¿Cómo conectarme a una base de datos MySQL a través del túnel SSH?

Pero ahora no sé qué hice en realidad. ¿Este comando afecta algo en el servidor? Y cómo cierro este túnel, porque ahora no puedo usar mi mysql local correctamente.

Utilizo OSX Lion y el servidor se ejecuta en Ubuntu 11.10.

Jacob
fuente

Respuestas:

241

Suponiendo que ejecutó este comando: ssh -f [email protected] -L 3306:mysql-server.com:3306 -Ncomo se describe en la publicación que vinculó.

Un desglose del comando:

  1. ssh: eso se explica por sí mismo. Invoca ssh.
  2. -f: (De la man sshpágina)

    Solicita a ssh que pase a segundo plano justo antes de la ejecución del comando. Esto es útil si ssh va a solicitar contraseñas o frases de contraseña, pero el usuario las quiere en segundo plano.

    Esencialmente, envíe ssha segundo plano una vez que haya ingresado las contraseñas para establecer la conexión; le devuelve el indicador de shell en en localhostlugar de iniciar sesión en remote-host.

  3. [email protected]: el servidor remoto en el que le gustaría iniciar sesión.
  4. -L 3306:mysql-server.com:3306: Esta es la parte interesante. -L(de la man sshpágina):

    [bind_address:] port: host: hostport Especifica que el puerto dado en el host local (cliente) se reenviará al host y puerto especificados en el lado remoto.

    Así -L 3306:mysql-server.com:3306se une el local de puerto 3306para el puerto remoto 3306 en el host mysql-server.com.

    Cuando se conecta al puerto local3306 , la conexión se reenvía a través del canal seguro a mysql-server.com. El host remoto , mysql-server.comluego se conecta al mysql-server.compuerto 3306.

  5. -N: no ejecute un comando. Esto es útil para "solo reenviar puertos" (citando la página del manual).

¿Este comando afecta algo en el servidor?

Sí, establece una conexión entre localhost y mysql-server.com en el puerto 3306 .

¿Y cómo cierro este túnel ...

Si lo ha usado -f, notará que el sshproceso que ha abierto va en segundo plano. El método más agradable para cerrarlo es ejecutar ps aux | grep 3306, encontrar el pidde ssh -f ... -L 3306:mysql-server.com:3306 -Ny kill <pid>. (O tal vez kill -9 <pid>; se me olvida si simplemente killfunciona). Eso tiene el hermoso beneficio de no matar todas tus otras sshconexiones; si tiene más de uno, restablecerlos puede ser un leve ... dolor.

... porque ahora no puedo usar mi mysql local correctamente.

Esto se debe a que efectivamente ha "capturado" el proceso local mysql y reenviado cualquier tráfico que intente conectarse a él, al proceso remoto mysql . Una solución mucho mejor sería no usar el puerto local 3306 en el reenvío de puertos. Usa algo que no se use, como 33060. (Los números más altos generalmente se usan menos; es bastante común reenviar una combinación como esta: "2525-> 25", "8080-> 80", "33060-> 3306" o similar. Hace que recordar sea un poco más fácil).

Entonces, si lo usara ssh -f [email protected] -L 33060:mysql-server.com:3306 -N, apuntaría su función Zend connect-to-mysql al localhostpuerto 33060, que se conectaría al mysql-server.compuerto 3306. Obviamente, aún puede conectarse a localhostun puerto 3306, por lo que aún puede usar el mysqlservidor local .

Simont
fuente
5
La mejor explicación que leí en un tiempo. Esto es muy útil cuando se accede a una base de datos remota desde entornos instalados localmente como R, por ejemplo. Funciona bien con autenticación de clave pública / privada. No con contraseñas porque no encontré la manera de pasar las contraseñas.
Matt Bannert
Aceptando esta respuesta como mejor debido a la explicación detallada.
Jacob
¡Buena respuesta! Por cierto, -9no es necesario kill, considerando que el proceso sigue funcionando bien ;-)
Lucio Paiva
46

Esto matará todas las sesiones ssh que tenga abiertas desde la terminal.

sudo killall ssh
thenetimp
fuente
"No se encontraron procesos coincidentes", dice.
Jacob
Parece que lo es. Mysql también funcionó bien, pero luego Apache comenzó a quejarse. Hice un reinicio y todo funciona como se esperaba. Problema resuelto, supongo :)
Jacob
5
Bueno, no querrás hacer esto si se trata de un entorno de
producción
12
Correr killall sshes un comando bastante imprudente. Aconsejo buscar en su lista de procesos (es decir, ps aux | grep sshcomo lo sugiere @simont arriba) para descubrir el ID de proceso específico de su proceso de túnel ssh. Entonces puedes matar el pid que específicamente.
Ben
Hay una buena posibilidad de que no quieras matarlos a todos.
wobbily_col
22

Nota: agregar como respuesta ya que los comentarios no admiten bloques de código.

En mi opinión, es mejor NO usar -fy, en su lugar, solo hacer un fondo del proceso como es normal con &. Eso le dará el pid exacto que necesita para matar:

ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid

O mejor aún, simplemente cree esto como un script de envoltura:

# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid

backend-tunnel mysql-workbench

backend-tunnel bash

Aaron
fuente
12
El uso -fpermite que la sshsesión continúe incluso cuando la sesión de la terminal está cerrada, a diferencia de presionar en segundo plano. Agarrar el piduso ps aux | grep ssh | grep <LOCAL-PORT>es bastante trivial.
Simont
1
@simont usar el pid explícito devuelto por el trabajo en segundo plano es más seguro, independientemente de cómo lo utilices en segundo plano. si tiene más de un proceso ssh en ejecución, lo pasará mal
aaron
El uso -ftambién tiene la ventaja de solicitar al usuario local la contraseña de inicio de sesión, si es necesario. Si lo usa &, el usuario no verá ese mensaje a menos que lleve el proceso al primer plano (por ejemplo, mediante el uso fg).
Bdoserror
3
la primera vez que su <LOCAL-PORT> ocurre en el pid de un proceso que también contiene el texto 'ssh' (como otro proceso ssh o sshd o editando un archivo con 'ssh' en el nombre) se dará cuenta de que esto enfoque, si bien es conveniente en escenarios simples, no es a prueba de balas
aaron