2017-12-15 20 views
0

empfingen anmelden Ich verwende als FTP-Server verdreht:Verdreht - wie FTP-Befehle von Server

from twisted.protocols.ftp import FTPFactory, FTPRealm 
from twisted.cred.portal import Portal 
from twisted.cred.checkers import AllowAnonymousAccess, FilePasswordDB 
from twisted.internet import reactor 

p = Portal(FTPRealm('./'), 
      [AllowAnonymousAccess(), FilePasswordDB("pass.dat")]) 

f = FTPFactory(p) 

reactor.listenTCP(21, f) 
reactor.run() 

Wie kann ich jede Anmeldung erhalten FTP-Befehl vom Client?

+0

Wird dieses Beispiel helfen? http://twistedmatrix.com/documents/current/_downloads/ftpclient.py – BoboDarph

Antwort

1

FTPRealm erstellt FTPAnonymousShell und FTPShell Instanzen (Avatare), um den Zugriff auf das Dateisystem zu vermitteln.

Diese Klassen implementieren beide IFTPShell. Eine Lösung besteht darin, einen Wrapper für FTPRealm zu erstellen, der einen Logging-Wrapper auf die erstellten Avatare anwendet.

from twisted.python.components import proxyForInterface 

class WrappingRealm(proxyForInterface(IRealm)): 
    wrap = staticmethod(logging_wrapper) 

    def requestAvatar(self, *a, **kw): 
     d = maybeDeferred(
      super(WrappingRealm, self).requestAvatar, 
      *a, **kw 
     ) 
     def got_avatar((iface, avatar, logout)): 
      return (iface, self.wrap(avatar), logout) 
     d.addCallback(got_avatar) 
     return d 

Und implementieren logging_wrapper so etwas wie:

class _LoggingFTPShell(proxyForInterface(IFTPShell)): 
    def makeDirectory(self, path): 
     log(avatar=self.avatar, operation="makeDirectory", path=path) 
     return super(_LoggingFTPShell, self).makeDirectory(path) 

    # The same for the rest of the methods of IFTPShell 
    # ... 

def logging_wrapper(avatar): 
    return _LoggingFTPShell(avatar) 

Dies ist ein bisschen langweilig, da Sie die Protokollierung auf der Schnittstelle für jede Methode hinzufügen müssen. Da die FTP-Protokollimplementierung von Twisted jedoch nativ keine Möglichkeiten bietet, die gewünschte Protokollierung durchzuführen, ist es schwierig, dies zu umgehen. Mit einigen Meta-Programmierung können Sie sich ein wenig Tipparbeit ersparen (aber auf Kosten einiger Komplexität).

würde Ein weiterer Ansatz ist ein Patch Twisted dazu beitragen, die Protokollierung Hinzufügen Sie interessiert sind.

Verwandte Themen