wake-up-neo.net

Wie erstelle ich einen SSH-Tunnel mit Python und Paramiko?

Ich lerne Python. Ich muss Ersteller tunneln, um Informationen aus einer Datenbank zu lesen und den Tunnel zu schließen. Ich benutze paramiko aber ich habe nicht mit tonelem beispiel gearbeitet. Bitte geben Sie ein Beispiel für einen einfachen Code, der einen Tunnel erstellt.

Danke im Voraus!

25
Ivan

Bei der Arbeit erstellen wir normalerweise SSH-Tunnel, die Ports weiterleiten. Wir machen das, indem wir den Standardbefehl ssh -L port:addr:port addr verwenden, wobei der Unterprozess in einem separaten Thread ausgeführt wird ..__ Ich fand diesen nützlichen Link: https://github.com/paramiko/paramiko/blob/master/demos/ forward.py mit einem Beispiel für das Port-Forwarding mit paramiko.

8
dario

Ich habe sshtunnel für meine Projekte verwendet. Beispiel für die Weiterleitung des lokalen Remote-MySQL-Ports an den lokalen Host-Port:

pip install sshtunnel
python -m sshtunnel -U root -P password -L :3306 -R 127.0.0.1:3306 -p 2222 localhost
7
pahaz

Obwohl dies nicht paramiko verwendet, glaube ich, dass es eine sehr saubere Lösung ist (ähnlich wie @ darios Antwort aber ohne den Thread in Python zu verwalten).

Es gibt dieses wenig erwähnte Feature im openssh-Client, mit dem wir einen ssh-Prozess über einen Unix-Socket steuern können, wobei man ssh zitiert wird:

-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.

Sie können also den Hintergrundprozess von ssh (mit -Nf) starten und diesen dann mit einem anderen ssh-Aufruf prüfen (oder beenden).

Ich verwende dies in einem Projekt, für das ein Reverse-Tunnel eingerichtet werden muss

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 stellt sicher, dass der Befehl ssh fehlschlägt, wenn der Tunnel nicht eingerichtet werden kann. Andernfalls wird er nicht beendet.

4
Filipe Pina

Ich habe paramiko für ein Projekt verwendet, das ich vor einem Jahr hatte. Hier ist der Teil meines Codes, an dem ich mich mit einem anderen Computer/Server verbunden habe und eine einfache Python-Datei ausgeführt habe:

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 und sdterr enthalten die Ein-/Ausgänge des von Ihnen ausgeführten Befehls.

Von hier aus glaube ich, dass Sie die Verbindung mit der Datenbank herstellen können.

Hier sind einige gute Informationen über Paramiko .

0
juliomalegria