2017-07-29 6 views
0

Hallo, ich versuche, eine einfache Verwaltungs-App zu schreiben, die mir Zugang zu Computern Shell Telnet telnet (dies ist nur Test für Python-Programmierung), wenn ich zu verbinden mein server dann habe ich nur schwarzen bildschirm im terminal (Windows telnet client) aber im protokoll meines programms gibt es die outpu form des subprozesses und es wird nicht gesendet an client ich habe auf Google nach vielen lösungen gesucht aber keiner von ihnen hat funktioniert Twisted richtig und Ergebnis war der gleicheEinfache administrative Anwendung in Python basierend auf Twisted hängt und sendet keine Daten

mein Server Code lib:

# -*- coding: utf-8 -*- 

from subprocess import Popen, PIPE 
from threading import Thread 
from Queue import Queue # Python 2 

from twisted.internet import reactor 
from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
import sys 

log = 'log.tmp' 

def reader(pipe, queue): 
    try: 
     with pipe: 
      for line in iter(pipe.readline, b''): 
       queue.put((pipe, line)) 
    finally: 
     queue.put(None) 

class Server(LineReceiver): 

    def connectionMade(self): 
     self.sendLine("Creating shell...") 
     self.shell = Popen("cmd.exe", stdout=PIPE, stderr=PIPE, bufsize=1, shell=True) 
     q = Queue() 
     Thread(target=reader, args=[self.shell.stdout, q]).start() 
     Thread(target=reader, args=[self.shell.stderr, q]).start() 
     for _ in xrange(2): 
      for pipe, line in iter(q.get, b''): 
       if pipe == self.shell.stdout: 
        sys.stdout.write(line) 
       else: 
        sys.stderr.write(line) 
     self.sendLine("Shell created!") 

    def lineReceived(self, line): 
     print line 
     #stdout_data = self.shell.communicate(line)[0] 
     self.sendLine(line) 


if __name__ == "__main__":  
    ServerFactory = Factory.forProtocol(Server) 

    reactor.listenTCP(8123, ServerFactory) #@UndefinedVariable 
    reactor.run() #@UndefinedVariable 

Antwort

0

Sie haben ein Blockierprogramm mit einem nicht blockierenden Programm gemischt. Die nicht blockierenden Teile werden nicht ausgeführt, da die blockierenden Teile blockieren. Die blockierenden Teile funktionieren nicht, da sie darauf angewiesen sind, dass die nicht blockierenden Teile ausgeführt werden.

Entfernen Sie die Popen und Queue und Thread und verwenden Sie stattdessen reactor.spawnProcess. Oder die Twisted loswerden und mehr Threads für das Networking verwenden.