Более развернуто задача звучит так: есть удаленных сервер с доступом по 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
* Удаленный запуск скриптов