web-dev-qa-db-ja.com

SSHトンネリング経由でMySQLに接続するには、Pythonを有効にします

Python 2.7を使用してPython別のMySQLサーバーに接続するためにMySqldbを使用しています

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

このように通常接続する代わりに、SSHキーペアを使用してSSHトンネルを介して接続するにはどうすればよいですか?

SSHトンネルは、理想的にはPythonで開く必要があります。 SSHトンネルホストとMySQLサーバーは同じマシンです。

18
Nyxynyx

ポート転送が必要になると思います。私はお勧め 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)
    ...
20
Carlos D.

これだけが私のために働いた

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()
12
Kathan Shah

Paramikoは、sshトンネリングを行うのに最適なpythonモジュールです。ここでコードを確認してください。 https://github.com/paramiko/paramiko/bloiko/blob/master/demos/forward。 py

コメントで述べたように、これは完璧に機能します。 Python MySQLdb接続 のSSHトンネル

1
yeaske

あなたの秘密鍵ファイルが暗号化されている場合、これは私のために働いたものです:

    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