2012-10-03 21 views
5

¿Hay algún ejemplo de iniciar una sesión SSH en una máquina remota con opciones de reenvío de puertos dentro de Twisted using Conch de modo que se pueda canalizar el tráfico TCP normal a través del túnel?¿Cómo puedo hacer el reenvío de puertos SSH desde Python Twisted?

Escenario:

Tengo un servidor que ejecuta un servicio personalizado basado Protobuf RPC-trenzado y una máquina con un cliente RPC basada en Twisted instalado. El servidor también está ejecutando SSH. En lugar de hablar directamente con el servicio RPC en el servidor, me gustaría conectarme al servidor utilizando SSH desde el cliente RPC, configurar el reenvío de puertos en el servidor y comunicarme con el servicio RPC utilizando Protobuf a través del túnel SSH.

Ya puedo configurar el reenvío de puertos manualmente y hacer que el cliente RPC hable con el servicio RPC señalando el cliente RPC a un puerto local en la casilla del cliente, solo tengo curiosidad sobre cómo puedo hacerlo. dentro del cliente directamente.

Respuesta

4

Sería increíble si hubiera documentación mejorada en Twisted para hacer cosas buenas con Conch (después de todo, ¿cuántas otras bibliotecas SSH programables hay?). Hasta que llegue ese día feliz, leer la implementación de la herramienta de línea de comandos conch puede ser de gran ayuda.

Aquí podemos ver que las opciones de reenvío de puertos desde la línea de comandos se convierten en algo de acción sobre la conexión SSH:

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

Creo que estás preguntando por una regla de reenvío locales, por lo que el localForwards loop está haciendo más o menos lo que quieres hacer.

+0

Gracias Jean-Paul! – Bryan

4

Implementación de un túnel El cliente Twisted SSH que realiza el reenvío de puertos locales puede ser sorprendentemente simple.

Basta con crear un basic Twisted Conch SSH client, e implementar la parte de reenvío de puertos en el serviceStarted método de la clase de conexión SSH de su cliente:

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) 

Eso es todo lo que hay a la misma (REMOTEHOST se establece en el punto de ssh servidor en sí, ya que eso es a lo que dijiste que te estás conectando).

Cuestiones relacionadas