2012-10-03 16 views
5

Czy są jakieś przykłady inicjowania sesji SSH na zdalnym komputerze z opcjami przekierowania portów z poziomu Skręconego przy użyciu Concha, tak aby można było przepuszczać normalny ruch TCP przez tunel?Jak mogę przekazywać port SSH z poziomu Python Twisted?

Scenariusz:

mam serwer działa na zlecenie Twisted opartego Protobuf usługę RPC i maszynę z zainstalowanym Twisted oparte klienta RPC. Na serwerze działa także SSH. Zamiast rozmawiać bezpośrednio z usługą RPC na serwerze, chciałbym połączyć się z serwerem za pomocą SSH od klienta RPC, skonfigurować przekazywanie portów na serwerze i komunikować się z usługą RPC za pomocą Protobuf przez tunel SSH.

Jestem już w stanie skonfigurować przekierowanie portów ręcznie i zlecić klientowi RPC komunikację z usługą RPC, wskazując klienta RPC na port lokalny w skrzynce klienta, jestem tylko ciekawy, jak mogę to zrobić bezpośrednio w kliencie.

Odpowiedz

4

Byłoby świetnie, gdyby w Twisted istniała ulepszona dokumentacja do robienia ładnych rzeczy z Conchem (w końcu, ile jest innych programowalnych bibliotek SSH?). Do tego szczęśliwego dnia lektura implementacji narzędzia wiersza poleceń conch może być bardzo pomocna.

Tutaj możemy zobaczyć, gdzie opcje przekierowania portów z linii poleceń są włączone do jakiegoś działania przez połączenie SSH:

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

myślę pytasz o lokalnej reguły przekierowania, więc localForwards pętla robi z grubsza to, co chcesz zrobić.

+0

Dzięki Jean-Paul! – Bryan

4

Implementacja tunelowania Twisted klient SSH, który wykonuje lokalne przekierowanie portów, może być zaskakująco prosty.

Wystarczy utworzyć basic Twisted Conch SSH client i wdrożyć część przekierowania portów w serviceStarted metodę klasy ssh swojego klienta:

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) 

To wszystko jest do niej (remotehost jest ustawiony, aby wskazywał ssh sam serwer, ponieważ o tym mówiliście, że się z nim łączy).