Подключение к MySQL (MariaDB) на удаленном сервере по SSH

Рейтинг: 0Ответов: 1Опубликовано: 15.06.2023

Не получается подключиться к 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()

Ответы

▲ 0Принят

В итоге получилось подключиться к БД.

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