2012-02-25 35 views

Respuesta

184

Suponiendo que corrió este comando: ssh -f [email protected] -L 3306:mysql-server.com:3306 -N como se describe en el post se conectó.

un desglose del comando:

  1. ssh: eso es bastante auto-explicativo. Invoca al ssh.
  2. -f: (Desde la página man ssh)

    solicitudes ssh para ir a 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 al localhost en lugar de iniciar sesión en remote-host.

  3. [email protected]: el servidor remoto en el que desea iniciar sesión.
  4. -L 3306:mysql-server.com:3306: Este es el tema interesante. -L (desde la página man ssh):

    [bind_address:] puerto: host: hostport Especifica que ese puerto, en el host local (cliente) es ser enviado al host y el puerto dado en el control remoto lado.

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

    Cuando se conecta a locales puerto 3306, la conexión se reenvía a través del canal seguro a mysql-server.com. El host remoto , mysql-server.com se conecta a mysql-server.com en el puerto 3306.

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

¿Este comando afecta nada en el servidor?

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

Y ¿Cómo se cierra este túnel ...

Si ha utilizado -f, se dará cuenta de que el proceso que ha abierto ssh cabezas en el fondo. El mejor método para cerrarlo es ejecutar ps aux | grep 3306, encontrar pid del ssh -f ... -L 3306:mysql-server.com:3306 -N y kill <pid>. (O tal vez kill -9 <pid>; Se me olvida si funciona kill). Eso tiene el hermoso beneficio de no que mata todas sus 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 has efectivamente "capturado" el proceso local de mysql y procesados ​​de todo el tráfico que intenta conectarse a él, fuera de la distanciamysqlproceso. Una solución mucho más agradable sería no utilizar 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).

Por lo tanto, si se ha utilizado ssh -f [email protected] -L 33060:mysql-server.com:3306 -N, a continuación, que le apunta su Zend conectar a MySQL función para localhost en el puerto 33060, que conectaría a mysql-server.com en el puerto 3306. Obviamente, todavía puede conectarse al localhost en el puerto 3306, por lo que aún puede utilizar el servidor local mysql.

+2

Mejor explicación que leo en mucho 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. –

+0

Aceptando esta respuesta como mejor debido a la explicación completa. – Jacob

+0

Esta es una gran respuesta. ¡Muy minucioso! – colefner

34

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

sudo killall ssh 
+0

' No se encontraron procesos coincidentes ", dice. – Jacob

+0

luego está cerrado. – thenetimp

+0

Parece que sí 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

13

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

En mi opinión, es mejor NO usar -f y en lugar de simplemente hacer el proceso de fondo con &. Eso le dará el pid exacta 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, basta con crear esto como un guión envoltorio:

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

backend-tunnel mysql-workbench

backend-tunnel bash

+8

El uso de '-f' permite que la sesión' ssh' continúe incluso cuando la sesión del terminal está cerrada, a diferencia de empujar De trasfondo. Agarrando el 'pid' usando' ps aux | grep ssh | grep 'es bastante trivial. – simont

+0

Esto es exactamente lo que estaba buscando. – respectTheCode

+1

@simont utilizando el pid explícito devuelto desde el trabajo en segundo plano es más seguro, independientemente de cómo lo fondo. Si tiene más de un proceso ssh en ejecución, lo pasará mal. – aaron

Cuestiones relacionadas