Сначала SSH с MySQL в Python - PullRequest
       35

Сначала SSH с MySQL в Python

5 голосов
/ 31 января 2012

Я пытаюсь подключиться к базе данных MySQL на удаленном сервере, используя MySQLdb в python.Проблема в том, что сначала мне нужно подключиться по SSH к хосту, а затем оттуда мне нужно подключиться к серверу MySQL.Однако проблема, с которой я столкнулся, заключается в том, что в MySQLdb, похоже, нет способа установить соединение SSH перед подключением к серверу SQL.Я проверил документацию, но мне не повезло.

Вот как я подключаюсь:

conn = MySQLdb.connect(host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')

Но мне действительно нужно что-то вроде этого:

conn = MySQLdb.connect(sshhost = 'sshhost.domain.com', sshuser = 'sshusername', sshpasswd = 'sshpasswd', host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')

Что, конечно, просто сделано.Кто-нибудь может дать какие-либо рекомендации?

Ответы [ 2 ]

19 голосов
/ 08 августа 2015

Я предпочитаю хранить туннель в коде Python, я очень не хотел создавать туннели вручную или отдельно, благодаря библиотеке sshtunnel, которая очень проста в использовании.

Вот простой пример, который будет работать для того, что вы хотите.

import MySQLdb
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
         ('sshhost.domain.com', 22),
         ssh_password="sshpasswd",
         ssh_username="sshusername",
         remote_bind_address=('mysqlhost.domain.com', 3306)) as server:

    conn = MySQLdb.connect(host='127.0.0.1',
                           port=server.local_bind_port,
                           user='user',
                           passwd='password',
                           db='dbname')
9 голосов
/ 31 января 2012

Настройте туннель ssh перед использованием MySQLdb.connect. Туннель заставит его выглядеть так, как будто у вас запущен mysql локально, настройте его примерно так

ssh user@host.com -L 9990:localhost:3306

здесь ваш локальный порт 9990 будет привязан к 3306 на удаленном хосте, -L означает локальный, затем 9990: localhost: 3306 означает LOCALPORT:

conn = MySQLdb.connect (host = 'mysqlhost.domain.com:9990', user = 'user', passwd = 'password', db = 'dbname')

обратите внимание на 9990.

Добавьте ваш открытый ssh-ключ пользователя на host.com, чтобы вам не приходилось вводить пароль каждый раз, когда вы хотите настроить туннель (используйте аутентификацию с открытым ключом).

Если вам нужно сделать это в python, есть библиотеки привязки python-to-ssh, которые вы можете вызвать из python, чтобы настроить туннель для вас.

...