2014-05-23 2 views
2
여기

에 데이터를 다시 보내기 ... 내가 다시 클라이언트 클래스 클라이언트에서받은 데이터를 보낼 수 있는지 궁금트위스트 portforward 프록시 클라이언트

from twisted.internet import protocol,reactor 
    from twisted.internet.protocol import Protocol,ClientFactory 

    class serverprotocol(Protocol): 

     def dataReceived(self,data): 
      print "[+] got \n" + data 
      factory = protocol.ClientFactory() 
      factory.protocol = Clientp 
      global xx 
      xx=data 
      print xx 
      reactor.connectTCP("127.0.0.1",80,factory) 

    class Clientp(Protocol): 
     def connectionMade(self): 
      print "sending " + xx 
      self.transport.write(xx) 

     def dataReceived(self,data): 
      print "+ got reply" + data 

    factory = protocol.ServerFactory() 
    factory.protocol = serverprotocol 
    reactor.listenTCP(3333, factory) 
    reactor.run() 

내가 지금까지 함께 온 일부 코드입니다 포트 3333에 연결하십시오.

더 나은 코딩 방법이 있다면 알려주십시오.

답변

-1

나는 비 트위스트 솔루션을 제시하는거야 바이어스니까 :

circuits 프레임 워크를 사용하여 전체 TCP 포트 전달 프록시로 예상대로이 작동
#!/usr/bin/env python 

from uuid import uuid4 as uuid 

from circuits import Component 
from circuits.net.events import close, connect, write 
from circuits.net.sockets import TCPClient, TCPServer 


class Client(Component): 

    channel = "client" 

    def init(self, sock, host, port, channel=channel): 
     self.sock = sock 
     self.host = host 
     self.port = port 

     TCPClient(channel=self.channel).register(self) 

    def ready(self, *args): 
     self.fire(connect(self.host, self.port)) 

    def disconnect(self, *args): 
     self.fire(close(self.sock), self.parent.channel) 

    def read(self, data): 
     self.fire(write(self.sock, data), self.parent.channel) 


class Proxy(Component): 

    channel = "server" 

    def init(self, bind, host, port): 
     self.bind = bind 
     self.host = host 
     self.port = port 

     self.clients = dict() 

     TCPServer(self.bind).register(self) 

    def connect(self, sock, host, port): 
     channel = uuid() 

     client = Client(
      sock, self.host, self.port, channel=channel 
     ).register(self) 

     self.clients[sock] = client 

    def disconnect(self, sock): 
     client = self.clients.get(sock) 
     if client is not None: 
      client.unregister() 
      del self.clients[sock] 

    def read(self, sock, data): 
     client = self.clients[sock] 
     self.fire(write(data), client.channel) 


app = Proxy(("0.0.0.0", 3333), "127.0.0.1", 22) 

from circuits import Debugger 
Debugger().register(app) 

app.run() 

.

터미널 1 (서버) : 여기

는 예를 들어 실행의

Fri May 23 14:05:02 
~/circuits 
$ ./proxy.py 
<registered[server] (<TCPServer/server 48541:MainThread (queued=0) [S]>, <Proxy/server 48541:MainThread (queued=3) [R]>)> 
<registered[*] (<Debugger/* 48541:MainThread (queued=0) [S]>, <Proxy/server 48541:MainThread (queued=4) [R]>)> 
<started[server] (<Proxy/server 48541:MainThread (queued=3) [R]>)> 
<registered[select] (<Select/select 48541:MainThread (queued=0) [S]>, <TCPServer/server 48541:MainThread (queued=0) [S]>)> 
<ready[server] (<TCPServer/server 48541:MainThread (queued=0) [S]>, ('0.0.0.0', 3333))> 
<_read[server] (<socket._socketobject object at 0x100ff57c0>)> 
<connect[server] (<socket._socketobject object at 0x100ff5980>, '127.0.0.1', 52911)> 
<_read[server] (<socket._socketobject object at 0x100ff5980>)> 
<registered[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] (<TCPClient/ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6 48541:MainThread (queued=0) [S]>, <Client/ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6 48541:MainThread (queued=0) [S]>)> 
<registered[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] (<Client/ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6 48541:MainThread (queued=0) [S]>, <Proxy/server 48541:MainThread (queued=3) [R]>)> 
<read[server] (<socket._socketobject object at 0x100ff5980>, 'SSH-2.0-OpenSSH_6.2\r\n')> 
<ready[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] (<TCPClient/ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6 48541:MainThread (queued=0) [S]>)> 
<write[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] ('SSH-2.0-OpenSSH_6.2\r\n')> 
<connect[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] ('127.0.0.1', 22)> 
<connected[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] ('127.0.0.1', 22)> 
<_write[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] (<socket._socketobject object at 0x100ff5830>)> 
<_read[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] (<socket._socketobject object at 0x100ff5830>)> 
<read[ee1c155f-d2de-4f09-b05d-5b5e6f4de1d6] ('SSH-2.0-OpenSSH_6.2\r\n')> 
<write[server] (<socket._socketobject object at 0x100ff5980>, 'SSH-2.0-OpenSSH_6.2\r\n')> 
<_write[server] (<socket._socketobject object at 0x100ff5980>)> 
<_read[server] (<socket._socketobject object at 0x100ff5980>)> 

2 터미널 (클라이언트) :

Fri May 23 14:06:26 
~ 
$ ssh -p 3333 localhost 
Last login: Fri May 23 14:04:51 2014 from localhost 

Fri May 23 14:06:31 
~ 
$ logout 
Connection to localhost closed. 
2

이있는 트위스트 FAQ : "How do I make input on one connection result in output on another"?

하지만 실제로는 꼬인 질문이 아닙니다. 파이썬 프로그래밍의 기본적인 질문입니다.

클래스 Clientp이 주어지면 나중에 할 일을 알 수 있도록 어떻게 인수를 전달합니까?

대답은 아주 간단하게 "그에게 __init__을주고 그것을 인수 통과"당신이 원하는 것은 전체 포트 전달자 인 경우

from twisted.internet.protocol import Protocol, Factory 
from twisted.internet.endpoints import TCP4ClientEndpoint 
from twisted.internet import reactor 

class serverprotocol(Protocol): 

    def dataReceived(self,data): 
     print "[+] got \n" + data 
     def clientProtocol(): 
      return Clientp(data) 
     endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 80) 
     endpoint.connect(Factory.forProtocol(clientProtocol)) 

class Clientp(Protocol): 
    def __init__(self, dataToSend): 
     self.dataToSend = dataToSend 

    def connectionMade(self): 
     self.transport.write(self.dataToSend) 

    def dataReceived(self,data): 
     print "+ got reply" + data 

reactor.listenTCP(3333, 
        Factory.forProtocol(serverprotocol)) 
reactor.run() 

, 대신 단순히 twistd portforward를 사용하거나 twisted.protocols.portforward의 코드에서 볼 수 있었다이다 .

0
from twisted.internet import protocol,reactor 
from twisted.internet.protocol import Protocol,ClientFactory 

clients=[] 

class serverprotocol(Protocol): 
    def connectionMade(self): 
     g.append(self) 

    def dataReceived(self,data): 

     factory = protocol.ClientFactory() 
     factory.protocol = Clientp 
     global xx 
     xx=data 
     reactor.connectTCP("127.0.0.1",80,factory) 

class Clientp(Protocol): 
    def connectionMade(self): 
     print "sending " 
     self.transport.write(xx) 

    def dataReceived(self,data): 
     print "+ got reply" 

     for x in clients: 
      x.transport.write(data) 

factory = protocol.ServerFactory() 
factory.protocol = serverprotocol 
reactor.listenTCP(8080, factory) 
reactor.run() 
+0

더 나은 파이썬 방법이 있다면 알려주세요. 기본적으로 포트 전달 프록시입니다. – mikie