30

データベースから情報を読み取るためにトンネリングを作成する必要があります。私は Paramiko を使用していますが、トンネリングはまだ使用していません。トンネルを作成して閉じる簡単なコードの例を教えてください。

4

5 に答える 5

15

職場では、通常、ポートを転送する ssh トンネルを作成します。ssh -L port:addr:port addrこれを行う方法は、サブプロセスを別のスレッドで実行する標準コマンドを使用することです。この便利なリンクを見つけました: https://github.com/paramiko/paramiko/blob/master/demos/forward.pyで、paramiko でポート転送を行う例を示します。

于 2011-11-17T18:47:27.507 に答える
9

これはparamikoを使用していませんが、実装するのは非常にクリーンなソリューションだと思います(@darioの回答に似ていますが、Pythonでスレッドを管理していません)。

このあまり言及されていない機能がopensshクライアントにあり、引用して、UNIXソケットを介してsshプロセスを制御できるようにしますman ssh

-M      Places the ssh client into “master” mode for connection sharing.  Multiple -M options places ssh
         into “master” mode with confirmation required before slave connections are accepted.  Refer to the
         description of ControlMaster in ssh_config(5) for details.
-S ctl_path
         Specifies the location of a control socket for connection sharing, or the string “none” to disable
         connection sharing.  Refer to the description of ControlPath and ControlMaster in ssh_config(5)
         for details.

sshしたがって、 (で)のバックグラウンド プロセスを開始し、別の呼び出し-Nfで確認 (または終了) することができます。ssh

逆トンネルを確立する必要があるプロジェクトでこれを使用します

from subprocess import call, STDOUT
import os
DEVNULL = open(os.devnull, 'wb')


CONFIG = dict(
    SSH_SERVER='ssh.server.com',
    SSH_PORT=2222,
    SSH_USER='myuser',
    SSH_KEY='/path/to/user.key',
    REMOTE_PORT=62222,
    UNIX_SOCKET='/tmp/ssh_tunnel.sock',
    KNOWN_HOSTS='/path/to/specific_known_host_to_conflicts',
)


def start():
    return call(
        [
            'ssh', CONFIG['SSH_SERVER'],
            '-Nfi', CONFIG['SSH_KEY'],
            '-MS', CONFIG['UNIX_SOCKET'],
            '-o', 'UserKnownHostsFile=%s' % CONFIG['KNOWN_HOSTS'],
            '-o', 'ExitOnForwardFailure=yes',
            '-p', str(CONFIG['SSH_PORT']),
            '-l', CONFIG['SSH_USER'],
            '-R', '%d:localhost:22' % CONFIG['REMOTE_PORT']
        ],
        stdout=DEVNULL,
        stderr=STDOUT
    ) == 0


def stop():
    return __control_ssh('exit') == 0


def status():
    return __control_ssh('check') == 0


def __control_ssh(command):
    return call(
        ['ssh', '-S', CONFIG['UNIX_SOCKET'], '-O', command, 'x'],
        stdout=DEVNULL,
        stderr=STDOUT
    )

-o ExitOnForwardFailure=yesトンネルを確立できない場合、ssh コマンドが失敗するようにします。それ以外の場合は終了しません。

于 2016-03-23T16:07:23.833 に答える
-5

私は1年前に行ったいくつかのプロジェクトに使用paramikoしました。これは、別のコンピューター/サーバーに接続して単純なpythonファイルを実行したコードの一部です:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='...', username='...', password='...')
stdin, stdout, stderr = ssh.exec_command('python hello.py')
ssh.close()

stdin、実行したコマンドの入力/出力が含まれていますstdoutsdterr

ここから、データベースに接続できると思います。

paramiko に関するお得な情報をご紹介します。

于 2011-11-17T17:26:15.667 に答える