2016-12-21 3 views
0

Ich begann vor kurzem mit der Verwendung von Twist, und ich versuche, einen Client zu erstellen, der verbindet und Befehle an einen SSH-Server sendet. (Ich erstelle nur den Client und verwende einen SSH-Server, um ihn zu testen). Nach dem Senden von 10 Befehlen (z. B. 'ls' Befehl) und Empfangen einer Antwort für jeden der Befehle, wird mein Client blockiert. Kann mir jemand dabei helfen, eine Lösung zu finden? Hier ist der wichtigste Teil meines Kunden. PS: Ich verwende twisted 12.0.0 (msi binaries).Python Twisted SSH-Client: Client blockiert nach dem Senden von 10 Befehlen

class SimpleConnection(connection.SSHConnection): 
    def serviceStarted(self): 
     self.openChannel(CommandChannel(conn=self)) 

class CommandChannel(channel.SSHChannel): 
    name = 'session' 
    def channelOpen(self, data): 
     global command 
     command = "ls" 
     d = self.conn.sendRequest(self, 'exec', common.NS(command), wantReply=True) 
     d.addCallback(self.dataReceived) 
    def dataReceived(self, data): 
     print (data) 
    def closeReceived(self): 
     self.conn.openChannel(self) 

Antwort

0

Das Problem war, dass der Server die Sitzungsnummer 10 wurde blockiert: "[SSHChannel Sitzung (10) auf SSHService ssh-Verbindung auf SimpleTransport, client] andere Seite offen Grund verweigert: ('öffnen, ist fehlgeschlagen ', 1) ". Dies ist ein normales Verhalten (MaxSessions in sshd_config, das die maximale Anzahl offener Sitzungen angibt, die pro Netzwerkverbindung zulässig sind, wurde auf 10 festgelegt).

SSHChannel schließt sich immer nach dem Ausführen eines Befehls. Daher sollte ein neuer Kanal für einen neuen Befehl erstellt werden, nachdem der alte Kanal geschlossen wurde. Hier ist der wichtigste Teil meines Clients korrigiert:

class SimpleConnection(connection.SSHConnection): 
    def serviceStarted(self): 
     self.openChannel(CommandChannel(conn=self)) 

class CommandChannel(channel.SSHChannel): 
    name = 'session' 
    def channelOpen(self, data): 
     global command 
     command = "ls" 
     d = self.conn.sendRequest(self, 'exec', common.NS(command), wantReply=True) 
     d.addCallback(self.dataReceived) 
    def dataReceived(self, data): 
     print (data) 
    def closed(self): 
     self.conn.serviceStarted()