source

SSH 터널링을 통해 Python이 MySQL에 연결할 수 있도록 설정

manysource 2023. 8. 28. 21:13

SSH 터널링을 통해 Python이 MySQL에 연결할 수 있도록 설정

사용 중MySqldbPython 2.7을 사용하여 Python이 다른 MySQL 서버에 연결할 수 있도록 합니다.

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

이렇게 정상적으로 연결하는 대신 SSH 키 쌍을 사용하여 SSH 터널을 통해 연결할 수 있는 방법은 무엇입니까?

SSH 터널은 Python이 여는 것이 이상적입니다.SSH 터널 호스트와 MySQL 서버가 동일한 시스템입니다.

오직 이것만이 나에게 효과가 있었습니다.

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()

포트 포워딩이 필요할 것 같습니다.추천합니다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)
    ...
from sshtunnel import SSHTunnelForwarder
import pymysql
import pandas as pd

tunnel = SSHTunnelForwarder(('SSH_HOST', 22), ssh_password=SSH_PASS, ssh_username=SSH_UNAME,
     remote_bind_address=(DB_HOST, 3306)) 
tunnel.start()
conn = pymysql.connect(host='127.0.0.1', user=DB_UNAME, passwd=DB_PASS, port=tunnel.local_bind_port)
data = pd.read_sql_query("SHOW DATABASES;", conn)

https://www.reddit.com/r/learnpython/comments/53wph1/connecting_to_a_mysql_database_in_a_python_script/ 에 대한 크레딧

개인 키 파일이 암호화되어 있으면 다음과 같은 이점이 있습니다.

    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()

개인 키 파일에 대한 경로만 쓸 수 있습니다.ssh_pkey='/home/userName/.ssh/id_ed25519'(설명은 여기 있습니다: https://sshtunnel.readthedocs.io/en/latest/) .

Oracle의 mysql.connector를 사용하는 경우에는 구문을 사용해야 합니다.cnx = mysql.connector.MySQLConnection(중요: 시공cnx = mysql.connector.connect(SSH를 통해 작동하지 않습니다! 버그입니다. (문서는 여기에 있습니다: https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html) .

또한 SQL 문이 이상적이어야 합니다.SQL 서버 측에서 오류가 발생한 경우 SQL 서버로부터 오류 메시지를 수신하지 않습니다.

import sshtunnel
import numpy as np

with sshtunnel.SSHTunnelForwarder(ssh_address_or_host='ssh_host',
                                  ssh_username="ssh_username",
                                  ssh_pkey='/home/userName/.ssh/id_ed25519',
                                  remote_bind_address=('localhost', 3306),
                                  ) as tunnel:
    cnx = mysql.connector.MySQLConnection(user='sql_username',
                                          password='sql_password',
                                          host='127.0.0.1',
                                          database='db_name',
                                          port=tunnel.local_bind_port)
    cursor = cnx.cursor()
    cursor.execute('SELECT * FROM db_name.tableName;')
    arr = np.array(cursor.fetchall())
    cursor.close()
    cnx.close()

이것은 나에게 도움이 됩니다.

import mysql.connector
import sshtunnel
with sshtunnel.SSHTunnelForwarder(
    ('ip-of-ssh-server', 'port-in-number-format'),
    ssh_username = 'ssh-username',
    ssh_password = 'ssh-password',
    remote_bind_address = ('127.0.0.1', 3306)
) as tunnel:
    connection = mysql.connector.connect(
        user = 'database-username',
        password = 'database-password',
        host = '127.0.0.1',
        port = tunnel.local_bind_port,
        database = 'databasename',
    )
    mycursor = connection.cursor()
    query = "SELECT * FROM datos"
    mycursor.execute(query)

다른 댓글에 이런 댓글이 있어요.파이썬을 사용하는 경우mysql.connectorOracle에서 생성된 구성을 사용해야 합니다.cnx = mysql.connector.MySQLConnection(....

중요: 시공cnx = mysql.connector.connect(...SSH를 통해 작동하지 않습니다! 이 버그는 원격 서버에서 연결이 삭제되는 이유를 이해하는 데 하루 종일 걸렸습니다.

with sshtunnel.SSHTunnelForwarder(
        (ssh_host,ssh_port),
        ssh_username=ssh_username,
        ssh_pkey=ssh_pkey,
        remote_bind_address=(sql_host, sql_port)) as tunnel:
    connection = mysql.connector.MySQLConnection(
        host='127.0.0.1',
        port=tunnel.local_bind_port,
        user=sql_username,
        password=sql_password)
    query = 'select version();'
    data = pd.read_sql_query(query, connection)
    print(data)
    connection.close()

만약 당신이 python을 사용하고 있고 모든 사용자 이름, 비밀번호, 호스트 및 포트가 정확하다면, 남은 것은 오직 하나, 즉 인수를 사용하는 것입니다(use_pure=True).이 인수는 python을 사용하여 세부 정보와 암호를 구문 분석합니다.mysql.connector.connect() 인수의 문서를 볼 수 있습니다.

with sshtunnel.SSHTunnelForwarder(
    (ssh_host,ssh_port),
    ssh_username=ssh_username,
    ssh_pkey=ssh_pkey,
    remote_bind_address=(sql_host, sql_port)) as tunnel:
connection = mysql.connector.MySQLConnection(
    host='127.0.0.1',
    port=tunnel.local_bind_port,
    user=sql_username,
    password=sql_password,
    use_pure='True')
query = 'select version();'
data = pd.read_sql_query(query, connection)
print(data)
connection. Close()

Paramiko는 ssh 터널링을 수행하는 최고의 파이썬 모듈입니다.https://github.com/paramiko/paramiko/blob/master/demos/forward.py 에서 코드를 확인하십시오.

댓글에 언급된 것처럼 이것은 완벽하게 작동합니다.Python MySQLDB 연결을 위한 SSH 터널

연결 변수를 매개 변수로 지정하는 것이 가장 좋습니다.제가 구현한 방법은 다음과 같습니다.매력적으로 작동합니다!

import mysql.connector
import sshtunnel
import pandas as pd
import configparser

config = configparser.ConfigParser()
config.read('c:/work/tmf/data_model/tools/config.ini')

ssh_host = config['db_qa01']['SSH_HOST']
ssh_port = int(config['db_qa01']['SSH_PORT'])
ssh_username = config['db_qa01']['SSH_USER']
ssh_pkey = config['db_qa01']['SSH_PKEY']
sql_host = config['db_qa01']['HOST']
sql_port = int(config['db_qa01']['PORT'])
sql_username = config['db_qa01']['USER']
sql_password = config['db_qa01']['PASSWORD']

with sshtunnel.SSHTunnelForwarder(
        (ssh_host,ssh_port),
        ssh_username=ssh_username,
        ssh_pkey=ssh_pkey,
        remote_bind_address=(sql_host, sql_port)) as tunnel:
    connection = mysql.connector.connect(
        host='127.0.0.1',
        port=tunnel.local_bind_port,
        user=sql_username,
        password=sql_password)
    query = 'select version();'
    data = pd.read_sql_query(query, connection)
    print(data)
    connection.close()

언급URL : https://stackoverflow.com/questions/21903411/enable-python-to-connect-to-mysql-via-ssh-tunnelling