2016-03-21 1 views
1

Ich kann einen grundlegenden FTP-Server machen, die Port beantwortet 21 (oder in diesem Beispiel 2121), um die Probe aus der Dokumentation verwendet:Python FTP Server: Wie kann ich unterstützen sowohl sichere als auch unsichere

from pyftpdlib.handlers import FTPHandler 
from pyftpdlib.servers import FTPServer 
from pyftpdlib.contrib.authorizers import WindowsAuthorizer 

def main(): 
    authorizer = WindowsAuthorizer() 
    # Use Guest user with empty password to handle anonymous sessions. 
    # Guest user must be enabled first, empty password set and profile 
    # directory specified. 
    #authorizer = WindowsAuthorizer(anonymous_user="Guest", anonymous_password="") 
    handler = FTPHandler 
    handler.authorizer = authorizer 
    server = FTPServer(('', 2121), handler) 
    server.serve_forever() 

if __name__ == "__main__": 
    main() 

Oder ich kann macht eine, die TLS unterstützt (auch dies ist die Probe aus der Dokumentation, außer unserem sicher FTP-Port 990 ist, nicht 21 wie in den original code sample dargestellt):

from pyftpdlib.servers import FTPServer 
from pyftpdlib.authorizers import DummyAuthorizer 
from pyftpdlib.contrib.handlers import TLS_FTPHandler 


def main(): 
    authorizer = DummyAuthorizer() 
    authorizer.add_user('user', '12345', '.', perm='elradfmw') 
    authorizer.add_anonymous('.') 
    handler = TLS_FTPHandler 
    handler.certfile = 'keycert.pem' 
    handler.authorizer = authorizer 
    # requires SSL for both control and data channel 
    #handler.tls_control_required = True 
    #handler.tls_data_required = True 
    server = FTPServer(('', 990), handler) 
    server.serve_forever() 

if __name__ == '__main__': 
    main() 

gibt es eine Möglichkeit zu machen, die Port 21 Antworten (unsicher) UND 990 (gesichert mit TLS) im selben Skript, in dem sie einen Bereich von passive Ports, zum Beispiel:

handler.passive_ports = range(50000, 50051) 

Ich stelle mir vor, ich könnte zwei Skripte schreiben, aber wie funktioniert es, wenn sie den passiven Port-Bereich teilen? Dieser Bereich ist erforderlich, und das aktuelle IIS-Setup, das wir verwenden, unterstützt sowohl TLS als auch unsichere Verbindungen. Ich möchte pyftpdlib in einem benutzerdefinierten Server verwenden, damit wir benutzerdefinierte Logik für hochgeladene Dateien durchführen können. Alles funktioniert gut, ich muss nur dieses letzte Bit verstehen und ich habe keine Erfahrung mit dem Schreiben von FTP-Servern.

+0

Ich fummelte herum mit Threading, hatte aber Schwierigkeiten, beide Threads gestartet zu bekommen. Also habe ich zwei Skripte gemacht, die das Debuggen erleichtern. Sie scheinen * glücklich genug zu sein auf der gleichen passiven Bandbreite, aber ich habe es noch nicht hart getroffen, aber eine Menge Uploads. Ich werde das morgen versuchen, es sei denn, es gibt einen besseren Weg (der Punkt des OP). –

Antwort

1

Sie müssen nicht beide Arten von Servern innerhalb desselben Prozesses haben, aber Sie können einfach separate Prozesse mit der gleichen passive_ports Einstellung verwenden. Beim Erstellen eines Sockets wird einfach versucht, einen Port aus dem angegebenen Bereich zu verwenden, der von keinem anderen Prozess auf dem System verwendet wird. Daher wird ein Serverprozess nur mit einem anderen Port erneut versuchen, wenn der bestimmte Server bereits von dem anderen Serverprozess verwendet wird.

+0

Das muss ich wirklich wissen. –