2012-10-03 6 views
5

Gibt es Beispiele zum Initiieren einer SSH-Sitzung an einen Remote-Computer mit Port-Weiterleitungsoptionen aus Twisted mit Conch, sodass man normalen TCP-Verkehr durch den Tunnel leiten kann?Wie kann ich SSH Port Forwarding von innerhalb Python Twisted tun?

Szenario:

Ich habe einen Server einen benutzerdefinierten Twisted-basierte Protobuf RPC-Dienst und eine Maschine mit einem Verdreht-basierten RPC-Client installierte ausgeführt wird. Der Server führt auch SSH aus. Anstatt direkt mit dem RPC-Dienst auf dem Server zu sprechen, möchte ich eine Verbindung zum Server mithilfe von SSH vom RPC-Client herstellen, die Portweiterleitung auf dem Server einrichten und mit dem RPC-Dienst mithilfe von Protobuf über den SSH-Tunnel kommunizieren.

Ich bin bereits in der Lage, port forwarding manuell einzurichten und den RPC-Client mit dem RPC-Dienst zu sprechen, indem Sie den RPC-Client auf einen lokalen Port auf der Client-Box zeigen, bin ich nur neugierig, wie ich dies tun kann innerhalb des Kunden direkt.

Antwort

4

Es wäre genial, wenn es in Twisted verbesserte Dokumentation gäbe, um nette Dinge mit Conch zu machen (schließlich, wie viele andere programmierbare SSH-Bibliotheken gibt es?). Bis dieser glückliche Tag kommt, kann das Lesen der Implementierung des Befehlszeilenprogramms conch eine große Hilfe sein.

Hier können wir sehen, wo Port-Forwarding-Optionen in der Befehlszeile in eine Aktion über die SSH-Verbindung eingeschaltet:

http://twistedmatrix.com/trac/browser/trunk/twisted/conch/scripts/conch.py#L188

Ich glaube, Sie über eine lokale Weiterleitungsregel sind gefragt, so dass die localForwards loop macht ungefähr das was du machen willst.

+0

Danke Jean-Paul! – Bryan

4

Die Implementierung eines Tunnelling Twisted SSH-Clients, der lokale Portweiterleitung durchführt, kann überraschend einfach sein.

Erstellen Sie einfach eine basic Twisted Conch SSH client und Umsetzung in der serviceStarted Methode der SSH-Verbindung Klasse Ihres Client den Port-Forwarding Teil: ssh

from twisted.conch.ssh import forwarding 

LOCALPORT = 8888 
REMOTEHOST = "127.0.0.1" 
REMOTEPORT = 9999 

class Connection(connection.SSHConnection): 

    def serviceStarted(self): 
     Channel = forwarding.SSHListenClientForwardingChannel 
     Factory = forwarding.SSHListenForwardingFactory 
     factory = Factory(self, (REMOTEHOST, REMOTEPORT), Channel) 
     s = reactor.listenTCP(LOCALPORT, factory) 

Das ist alles dort ist es (REMOTE wird auf Punkt Server selbst, da das ist, was du gesagt hast, du verbindest dich mit).