Как создать SSH туннель с использованием Python и Paramiko? - PullRequest
27 голосов
/ 17 ноября 2011

Я изучаю Python. Мне нужно туннелировать создателей, чтобы прочитать информацию из базы данных и закрыть туннель. Я использую paramiko, но я не работал с примером Tonelem. приведите пример простого кода, создающего туннель.

Заранее спасибо!

Ответы [ 4 ]

10 голосов
/ 17 ноября 2011

На работе мы обычно создаем ssh-туннели для переадресации портов. Мы делаем это, используя стандартную команду ssh -L port:addr:port addr с подпроцессом, работающим в отдельном потоке. Я нашел эту полезную ссылку: https://github.com/paramiko/paramiko/blob/master/demos/forward.py с примером переадресации портов с помощью paramiko.

9 голосов
/ 17 июня 2015

Я использовал sshtunnel для своих проектов. Пример перенаправления удаленного локального порта MySQL на локальный порт хоста:

pip install sshtunnel
python -m sshtunnel -U root -P password -L :3306 -R 127.0.0.1:3306 -p 2222 localhost
5 голосов
/ 23 марта 2016

Несмотря на то, что здесь не используется paramiko, я считаю, что это очень чистое решение для реализации (аналогично @ dario's answer , но без управления потоком в python).

В openssh-клиенте есть такая мало упоминаемая функция, которая позволяет нам контролировать процесс ssh через сокет unix, заключая в кавычки 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 не будет выполнена, если туннель не может быть установлен, иначе он не выйдет.

0 голосов
/ 17 ноября 2011

Я использовал 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, stdout и sdterr содержат входы / выходы выполненной вами команды.

Отсюда, я думаю, вы можете установить соединение с базой данных.

Вот хорошая информация о paramiko .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...