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サーバーは同じマシンです。
ポート転送が必要になると思います。私はお勧め 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)
...
これだけが私のために働いた
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()
Paramikoは、sshトンネリングを行うのに最適なpythonモジュールです。ここでコードを確認してください。 https://github.com/paramiko/paramiko/bloiko/blob/master/demos/forward。 py
コメントで述べたように、これは完璧に機能します。 Python MySQLdb接続 のSSHトンネル
あなたの秘密鍵ファイルが暗号化されている場合、これは私のために働いたものです:
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()