8

djangoを使用してリモートmysqlデータベースに接続しようとしています。
ドキュメントには、データベースに接続するために最初にSSHトンネルを開く必要があると指定されています。
特定の設定が設定されているときはいつでもSSHトンネルを開くことができるPythonライブラリはありますか?

4

5 に答える 5

10

paramiko転送機能を試すことができます。paramiko の概要については、こちらを参照してください。

于 2010-12-06T08:13:37.467 に答える
7

sshtunnel パッケージを使用してみてください。

これは簡単です:

pip install sshtunnel
python -m sshtunnel -U vagrant -P vagrant -L :3306 -R 127.0.0.1:3306 -p 2222 localhost

開示: 私はこのパッケージの作成者でありメンテナーです。

于 2015-06-17T20:08:37.997 に答える
2

コードにドロップできる小さなクラスを次に示します。

import subprocess
import random
import tempfile

class SSHTunnel:

    def __init__(self, host, user, port, key, remote_port):
        self.host = host
        self.user = user
        self.port = port
        self.key = key
        self.remote_port = remote_port
        # Get a temporary file name
        tmpfile = tempfile.NamedTemporaryFile()
        tmpfile.close()
        self.socket = tmpfile.name
        self.local_port = random.randint(10000, 65535)
        self.local_host = '127.0.0.1'
        self.open = False

    def start(self):
        exit_status = subprocess.call(['ssh', '-MfN',
            '-S', self.socket,
            '-i', self.key,
            '-p', self.port,
            '-l', self.user,
            '-L', '{}:{}:{}'.format(self.local_port, self.local_host, self.remote_port),
            '-o', 'ExitOnForwardFailure=True',
            self.host
        ])
        if exit_status != 0:
            raise Exception('SSH tunnel failed with status: {}'.format(exit_status))
        if self.send_control_command('check') != 0:
            raise Exception('SSH tunnel failed to check')
        self.open = True

    def stop(self):
        if self.open:
            if self.send_control_command('exit') != 0:
                raise Exception('SSH tunnel failed to exit')
            self.open = False

    def send_control_command(self, cmd):
        return subprocess.check_call(['ssh', '-S', self.socket, '-O', cmd, '-l', self.user, self.host])

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, type, value, traceback):
        self.stop()

たとえば、MySQL (通常はポート 3306) で使用する方法は次のとおりです。

with SSHTunnel('database.server.com', 'you', '22', '/path/to/private_key', '3306') as tunnel:
    print "Connected on port {} at {}".format(tunnel.local_port, tunnel.local_host)
于 2016-04-07T19:34:57.067 に答える