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