Пример использования ssh туннеля (tunnel) для sql запроса на python

Более развернуто задача звучит так: есть удаленных сервер с доступом по ssh. на сервере запущена БД. База данных настроена по безопасности так, что запросы можно делать только с локальной машины localhost. Требуется выполнить запрос к базе данных программно. Конечно можно вручную подцепиться к серверу а потом к БД, и выполнить sql query. Можно также залить какой-то скрипт на сервер и запросы пропускать через него. Но как же выполнить SQL запрос через ssh удаленно с рабочей машины? Для этого мы воспользуемся построением SSH туннеля.
Для примера возьмем БД mysql, однако это может быть и postgres и другая БД.
Также важной особенностью будет и то, что доступ по ssh осуществляется через публичный ключ. Вариант авторизации только по логину и паролю также рассмотрим, и добавим в код.
Ключом к решению задачи является библиотека paramiko. В стандартные набор она не входит, поэтому для установки выполняем pip install paramiko. Данная библиотека содержит обширный набор функций для работы по ssh как с серверной так и с клиентской стороны.

import mysql.connector
import paramiko

# параметры соединения по SSH
ssh_username = "ssh_username"
ssh_password = "ssh_password"
ssh_host = "ssh_host"
ssh_port = 22

# параметры соединения по SSH при использовании авторизации по ключу
ssh_username = "ssh_username"
ssh_key_path = "/path/to/ssh/key"
ssh_key_password = "ssh_key_password"
ssh_host = "ssh_host"
ssh_port = 22

# Параметры соединения с БД MySQL
mysql_username = "mysql_username"
mysql_password = "mysql_password"
mysql_host = "127.0.0.1"
mysql_port = 3306
mysql_database = "database_name"

# Загружаем SSH ключ
private_key = paramiko.RSAKey.from_private_key_file(ssh_key_path, password=ssh_key_password)

# Открываем SSH Tunnel
transport = paramiko.Transport((ssh_host, ssh_port))
transport.connect(username=ssh_username, password=ssh_password)
# вместо предыдущей строки, для соединения по ключу, используем параметр pkey
transport.connect(username=ssh_username, pkey=private_key)

local_bind_address = (mysql_host, mysql_port)
transport.start_client()

# Соединяемся с MySQL через SSH Tunnel
cnx = mysql.connector.connect(user=mysql_username, password=mysql_password,
                              host=mysql_host, port=mysql_port,
                              database=mysql_database,
                              transport=transport)

# Делаем селект запрос к базе данных
cursor = cnx.cursor()
query = "SELECT * FROM table_name"
cursor.execute(query)
for row in cursor:
    print(row)

# Закрываем соединение с Базой данных
cursor.close()
cnx.close()

# Закрываем ssh тоннель
transport.close()

Библиотека Python Paramiko используется для безопасных (SSH) подключений к удаленным машинам. Некоторые распространенные варианты использования Paramiko включают в себя:

* Управление ключами SSH
* Передача файлов по SFTP
* Удаленное выполнение команды
* Port forwarding
* Удаленный запуск скриптов

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>