web-dev-qa-db-fra.com

Permettre à Python de se connecter à MySQL via le tunneling SSH

J'utilise MySqldb avec Python 2.7 pour permettre à Python de se connecter à un autre serveur MySQL

import MySQLdb
db = MySQLdb.connect(Host="sql.domain.com",
     user="dev", 
      passwd="*******", 
      db="appdb")

Au lieu de vous connecter normalement comme cela, comment établir une connexion via un tunnel SSH à l'aide de paires de clés SSH? 

Le tunnel SSH devrait idéalement être ouvert par Python. L'hôte du tunnel SSH et le serveur MySQL sont la même machine.

13
Nyxynyx

Je suppose que vous aurez besoin d'une redirection de port. Je recommande sshtunnel.SSHTunnelForwarder 

import mysql.connector
import sshtunnel

with sshtunnel.SSHTunnelForwarder(
        (_Host, _ssh_port),
        ssh_username=_username,
        ssh_password=_password,
        remote_bind_address=(_remote_bind_address, _remote_mysql_port),
        local_bind_address=(_local_bind_address, _local_mysql_port)
) as tunnel:
    connection = mysql.connector.connect(
        user=_db_user,
        password=_db_password,
        Host=_local_bind_address,
        database=_db_name,
        port=_local_mysql_port)
    ...
15
Carlos D.

Seulement cela a fonctionné pour moi

import pymysql
import paramiko
import pandas as pd
from paramiko import SSHClient
from sshtunnel import SSHTunnelForwarder
from os.path import expanduser

home = expanduser('~')
mypkey = paramiko.RSAKey.from_private_key_file(home + pkeyfilepath)
# if you want to use ssh password use - ssh_password='your ssh password', bellow

sql_hostname = 'sql_hostname'
sql_username = 'sql_username'
sql_password = 'sql_password'
sql_main_database = 'db_name'
sql_port = 3306
ssh_Host = 'ssh_hostname'
ssh_user = 'ssh_username'
ssh_port = 22
sql_ip = '1.1.1.1.1'

with SSHTunnelForwarder(
        (ssh_Host, ssh_port),
        ssh_username=ssh_user,
        ssh_pkey=mypkey,
        remote_bind_address=(sql_hostname, sql_port)) as tunnel:
    conn = pymysql.connect(Host='127.0.0.1', user=sql_username,
            passwd=sql_password, db=sql_main_database,
            port=tunnel.local_bind_port)
    query = '''SELECT VERSION();'''
    data = pd.read_sql_query(query, conn)
    conn.close()
7
Kathan Shah

Paramiko est le meilleur module python pour la tunnelisation ssh. Découvrez le code ici: https://github.com/paramiko/paramiko/blob/master/demos/forward.py

Comme indiqué dans les commentaires, celui-ci fonctionne parfaitement . Tunnel SSH pour la connexion MySQLdb à Python

1
yeaske