mysql - usar - usos ssh
¿Cómo cerrar este túnel ssh? (3)
Abrí un túnel ssh como se describe en esta publicación: Zend_Db: ¿Cómo puedo conectarme a una base de datos MySQL a través del túnel SSH?
Pero ahora no sé lo que realmente hice. ¿Este comando afecta algo en el servidor? Y cómo cierro este túnel, porque ahora no puedo usar mi mysql local correctamente.
Uso OSX Lion y el servidor se ejecuta en Ubuntu 11.10.
Esto matará todas las sesiones ssh que tengas abiertas desde la terminal.
sudo killall ssh
Nota: agregar como respuesta ya que los comentarios no admiten bloques de código.
En mi opinión, es mejor NO utilizar -f
y, en su lugar, simplemente hacer un seguimiento del proceso de forma 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, solo crea 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
Asumiendo que ejecutó este comando: ssh -f [email protected] -L 3306:mysql-server.com:3306 -N
como se describe en la publicación que ha vinculado.
Un desglose del comando:
-
ssh
: eso es bastante autoexplicativo. Invoca assh
. -f
: (Desde la página deman ssh
delman ssh
)Solicita a ssh que vaya al fondo justo antes de la ejecución del comando. Esto es útil si ssh va a pedir contraseñas o frases de contraseña, pero el usuario lo quiere en segundo plano.
Esencialmente, envíe
ssh
al fondo una vez que haya ingresado las contraseñas para establecer la conexión; le devuelve la solicitud de shell enlocalhost
lugar de iniciar sesión enremote-host
.-
[email protected]
: el servidor remoto en el que desea iniciar sesión. -L 3306:mysql-server.com:3306
: este es el tema interesante.-L
(de la página delman ssh
):[bind_address:] port: host: hostport Especifica que el puerto dado en el host local (cliente) debe reenviarse al host y puerto dados en el lado remoto.
Entonces
-L 3306:mysql-server.com:3306
vincula el puerto local3306
al puerto remoto3306
en elmysql-server.com
.Cuando se conecta al puerto local
3306
, la conexión se reenvía a través del canal seguro amysql-server.com
. El host remoto ,mysql-server.com
luego se conecta amysql-server.com
en el puerto3306
.-N
: no ejecutes un comando. Esto es útil para "solo reenviar puertos" (citando la página man).
¿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 usó -f
, notará que el proceso ssh
que ha abierto se dirige al fondo. El mejor método para cerrarlo es ejecutar ps aux | grep 3306
ps aux | grep 3306
, busca el pid
del ssh -f ... -L 3306:mysql-server.com:3306 -N
, y kill <pid>
. (O tal vez kill -9 <pid>
; me olvido si solo kill
funciona). Eso tiene el hermoso beneficio de no matar todas tus otras conexiones ssh
; si tienes más de uno, reestablecerlos puede ser un leve ... dolor.
... porque ahora no puedo usar mi mysql local correctamente.
Esto se debe a que efectivamente "capturó" el proceso mysql
local y reenvió todo el tráfico que intenta conectarse al proceso remoto mysql
. Una solución mucho más agradable sería no usar el puerto local 3306 en el puerto de avance. Use algo que no se usa, como 33060. (Los números más altos generalmente son menos utilizados, es muy común usar una combinación como esta: "2525-> 25", "8080-> 80", "33060-> 3306" o similar. Hace recordar algo más fácil).
Entonces, si usara ssh -f [email protected] -L 33060:mysql-server.com:3306 -N
, entonces apuntaría su función Zend connect-to-mysql a localhost
en el puerto 33060
, lo que haría conéctese a mysql-server.com
en el puerto 3306
. Obviamente, todavía puede conectarse a localhost
en el puerto 3306
, por lo que aún puede usar el servidor mysql
local.