ssh primero con mysqldb en python

Estoy tratando de conectarme a una base de datos MySQL en un servidor remoto usando MySQLdb en python. El problema es que primero necesito SSH en el host, y luego desde allí, necesito conectarme al servidor MySQL. Sin embargo, el problema que tengo es que MySQLdb no parece tener una forma de establecer una conexión SSH antes de conectarse al servidor SQL. He comprobado la documentación pero no he tenido suerte.

Así es como me estoy conectando:

conn = MySQLdb.connect(host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname') 

Pero lo que realmente necesito es algo como esto:

 conn = MySQLdb.connect(sshhost = 'sshhost.domain.com', sshuser = 'sshusername', sshpasswd = 'sshpasswd', host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname') 

Que por supuesto se acaba de hacer. ¿Alguien puede hacer alguna recomendación?

Configure un túnel ssh antes de usar MySQLdb.connect. El túnel hará que parezca que tienes mysql ejecutándose localmente, configúralo de esta forma

 ssh user@host.com -L 9990:localhost:3306 

aquí su puerto local 9990 se unirá a 3306 en el host remoto, -L significa local, luego 9990: localhost: 3306 significa LOCALPORT:

conn = MySQLdb.connect (host = ‘mysqlhost.domain.com:9990’, usuario = ‘usuario’, passwd = ‘contraseña’, db = ‘nombrebd’)

Fíjate en el 9990.

Agregue su clave de usuario ssh pública a host.com para que no tenga que escribir la contraseña cada vez que desee configurar el túnel (use autenticación de clave pública).

Si necesita hacer esto dentro de python, hay bibliotecas de enlace python-to-ssh que puede llamar desde python para configurar el túnel por usted.

Prefiero mantener el túnel dentro del código de python, odio crear túneles manualmente o por separado, gracias a la biblioteca sshtunnel es muy fácil de usar.

Aquí hay una muestra simple que funcionará para lo que quieras.

 import MySQLdb from sshtunnel import SSHTunnelForwarder with SSHTunnelForwarder( ('sshhost.domain.com', 22), ssh_password="sshpasswd", ssh_username="sshusername", remote_bind_address=('mysqlhost.domain.com', 3306)) as server: conn = MySQLdb.connect(host='127.0.0.1', port=server.local_bind_port, user='user', passwd='password', db='dbname')