it-swarm.com.de

Aktivieren Sie Python für die Verbindung zu MySQL über SSH-Tunneling

Ich verwende MySqldb mit Python 2.7, damit Python Verbindungen zu einem anderen MySQL-Server herstellen kann

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

Anstelle einer normalen Verbindung, wie kann die Verbindung über einen SSH-Tunnel mit SSH-Schlüsselpaaren hergestellt werden? 

Der SSH-Tunnel sollte idealerweise von Python geöffnet werden. Der SSH-Tunnel-Host und der MySQL-Server sind dieselbe Maschine.

13
Nyxynyx

Ich schätze, du brauchst Portweiterleitung. Ich empfehle 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.

Nur das hat für mich funktioniert

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 ist das beste Python-Modul für ssh-Tunneling. Den Code finden Sie hier: https://github.com/paramiko/paramiko/blob/master/demos/forward.py

Wie in den Kommentaren gesagt, funktioniert es perfekt. SSH-Tunnel für Python MySQLdb-Verbindung

1
yeaske

Wenn Ihre private Schlüsseldatei verschlüsselt ist, hat dies für mich funktioniert:

    mypkey = paramiko.RSAKey.from_private_key_file(<<file location>>, password='password')
    sql_hostname = 'sql_hostname'
    sql_username = 'sql_username'
    sql_password = 'sql_password'
    sql_main_database = 'sql_main_database'
    sql_port = 3306
    ssh_Host = 'ssh_Host'
    ssh_user = 'ssh_user'
    ssh_port = 22


    with SSHTunnelForwarder(
            (ssh_Host, ssh_port),
            ssh_username=ssh_user,
            ssh_pkey=mypkey,
            ssh_password='ssh_password',
            remote_bind_address=(sql_hostname, sql_port)) as tunnel:
        conn = pymysql.connect(Host='localhost', 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)
        print(data)
        conn.close()
0
karthik r