Подключение к MySQL (MariaDB) на удаленном сервере по SSH
Не получается подключиться к mysql на удаленном сервере. Ошибка:
mysql.connector.errors.DatabaseError: 2003 (HY000): Can't connect to MySQL server on 'xxx.hoct.com:3306' (10060)
Подключение к серверу по ssh происходит. Для SSH туннеля выбрал paramiko, т.к. подключиться получается только если отключить алгоритмы - ['rsa-sha2-512', 'rsa-sha2-256']. Видел много примеров, как делается ssh туннель через библиотеку sshtunnel, но как в ней отключить алгоритмы я не понял.
Скорее всего mysql.connector нужно, как то передать, что бы соединение происходило через ssh туннель. Прошу помочь исправить код.
import mysql.connector # pip install mysql-connector-python
from paramiko import RSAKey, SSHClient, Transport
ssh_passprase = 'passprase'
ssh_key_path = 'C:\\Users\\dell\\.ssh\\deploy_pk2'
private_key = RSAKey.from_private_key_file(ssh_key_path, password=ssh_passprase)
ssh_host = 'xxx.hoct.com'
ssh_username = 'user'
ssh_port = 22
sql_hostname = 'localhost'
sql_port = 3306
sql_username = 'user'
sql_password = 'password'
sql_main_database = 'db'
transport = Transport((ssh_host, int(ssh_port)))
transport.disabled_algorithms = {'pubkeys': ['rsa-sha2-512', 'rsa-sha2-256']}
transport.connect(username=ssh_username, pkey=private_key)
transport.local_bind_address = (sql_port, sql_port)
transport.open_channel("session", (ssh_host, sql_port), (sql_hostname, sql_port))
print(mysql.connector.__version__)
cnx = mysql.connector.connect(user=sql_username, password=sql_password,
host=sql_hostname, port=sql_port,
database=sql_main_database,
)
cursor = cnx.cursor()
query = "SELECT * FROM price_source"
cursor.execute(query)
for row in cursor:
print(row)
cnx.close()
transport.close()
Ответы (1 шт):
Автор решения: Konst Abash
→ Ссылка
В итоге получилось подключиться к БД.
import paramiko
import pymysql
ssh_passprase = 'passprase'
ssh_key_path = 'C:\\Users\\dell\\.ssh\\deploy_pk2'
private_key = RSAKey.from_private_key_file(ssh_key_path, password=ssh_passprase)
ssh_host = 'xxx.hoct.com'
ssh_username = 'user'
ssh_port = 22
sql_hostname = 'localhost'
sql_port = 3306
sql_username = 'user'
sql_password = 'password'
sql_main_database = 'db'
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=ssh_host, username=ssh_username, port=ssh_port, look_for_keys=False, allow_agent=False, pkey=private_key,
password=None, disabled_algorithms=dict(pubkeys=["rsa-sha2-512", "rsa-sha2-256"]))
transport = client.get_transport()
channel = transport.open_channel("direct-tcpip", ('127.0.0.1', sql_port), (sql_hostname, sql_port))
c=pymysql.connect(database=sql_main_database, user=sql_username, password=sql_password, defer_connect=True)
c.connect(channel)
with c.cursor() as cursor:
cursor.execute('SELECT VERSION()')
print(cursor.fetchone())