FTP Client Problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
chill
User
Beiträge: 2
Registriert: Sonntag 7. November 2010, 21:48

Hallo ich möchte eine Reihe von FTP-Servern in meinem Netz prüfen.

Schwerpunkt ist die Prüfung auf anonymen Zugang und auf Schreibrechte. Neben bei Prüfe ich auf weitere Schlechte Passwörter
Das ist mein erstes Python Programm.

Mein Problem:
das Programm endet nach bearbeitung der 12 IP mit dem Fehler:
IP_addr_here
Traceback (most recent call last):
File "ftp_write_cheak_2", line 61, in <module>
FTP = ftplib.FTP(line,"NULL","NULL")
File "C:\Python26\lib\ftplib.py", line 116, in __init__
self.connect(host)
File "C:\Python26\lib\ftplib.py", line 134, in connect
self.welcome = self.getresp()
File "C:\Python26\lib\ftplib.py", line 209, in getresp
resp = self.getmultiline()
File "C:\Python26\lib\ftplib.py", line 195, in getmultiline
line = self.getline()
File "C:\Python26\lib\ftplib.py", line 182, in getline
line = self.file.readline()
File "C:\Python26\lib\socket.py", line 444, in readline
data = self._sock.recv(self._rbufsize)
socket.error: [Errno 10054] Eine vorhandene Verbindung wurde vom Remotehost gesc
hlossen

Ich nutze Python 2.7 und lese grade ein Tut.

http://www.python-forum.de/pastebin.php?mode=view&s=87
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Hallo,

Ohne in deinen Code reingeschaut zu haben: Du verwendest Python 2.7, das Verzeichnis heißt aber 2.6.
Das Problem ist, dass der Server, den du ansprichst, die Verbindung beendet (z.B. weil du zu oft ein ungültiges Passwort eingegeben hast). Diesen Fehler (und zwar genau diesen) solltest du an der / den entsprechenden Stellen mit einem entsprechenden except abfangen:

Code: Alles auswählen

try:
    bla
except socket.error:
    # Server hat uns rausgeworfen
    spam
chill
User
Beiträge: 2
Registriert: Sonntag 7. November 2010, 21:48

Ja ich habe Python 2.6.6 sry habe das mit einem anderen PC verwechselt.
Ich habe auf meiner input liste einige FTPs von denen die Verbindung zurückgesetzt wird das ist kein Problem. Bei denen kommt die Meldung:

_IP_HERE_ ERR <class 'socket.error'> [Errno 10054] Eine vorhandene Verbind
ung wurde vom Remotehost geschlossen

Das Problem: Nach einigen IPs kommt der Fehler mit dem Traceback und bei dem heist es ja nicht <class 'socket.error'> ... sondern socket.error ... ist allso trotz selber errno nicht die Art von Fehlern die ich abfange. In der Zeile 75 fange ich ja alle Fehler ab und das geht auch bei den "normalen" socket.error ganz gut. Wenn ich die Problem IP aus der Liste streiche dann geht mein Script ohne Probleme weiter.

btw: Wie verwende ich die FTP.connect methode?
BlackJack

@chill: Das ist alles ein wenig unübersichtlich. Ich würde den Code auf Modulebene noch in einer Funktion verschwinden lassen und das Vorhandene auf mehr Unterfunktionen verteilen, zumindest bis alle ``continue``\s nicht mehr benötigt werden. Und bitte *echte* Funktionen und keine benannten Code-Abschnitte ohne Argumente aber mit Zugriff auf globale Daten.

In `func()` sind an mindestens zwei Stellen Zugriffe auf `myfile` möglich bevor dieser Name an ein Dateiobjekt gebunden wurde. Und dann bindest Du ihn potentiell mehrfach an immer neu geöffnete Dateiobjekte die nie explizit geschlossen werden. Da auf die Datei von mehreren Stellen im Programm aus über verschiedene Dateiobjekte im "append"-Modus zugegriffen wird, kann das je nach Betriebssystem auch hübschen Datensalat geben.

Die Art wie Du den Zeilenumbruch von den Zeilen aus der Server-Datei entfernst, ist nicht robust. Nicht jede Art Zeilenenden zu kodieren benutzt nur ein Byte dafür und die letzte Zeile einer Datei muss nicht zwingend mit einem Zeilenende-Zeichen abgeschlossen werden. Da würdest Du dann das letzte Zeichen vom Server entfernen.

Das ``try``/``except`` um `FTP.close()` steht da ja wohl um dem `NameError` im ersten Schleifendurchlauf zu entgehen. Wieso steht das `close()` dort bevor die Verbindung überhaupt geöffnet wurde!? Das ist doch unlogisch.

Das durchprobieren der Zugangsdaten würde ich mit einer Schleife schreiben, statt ``try``/``except``-Blöcke immer tiefer zu verschachteln.

Wenn Du die allgemeine `Exception` behandelst, statt ein nacktes ``except:`` zu verwenden, kannst Du der Ausnahme auch einen Namen geben und musst dafür nicht über `sys.exc_info()` gehen.

Zur eigentlichen Frage: Du hast drei Operationen auf einem `FTP`-Exemplar, bei denen keine Ausnahmen behandelt werden. Eine von denen schlägt offenbar bei bestimmten Servern fehl.
Antworten