Seite 1 von 1
ftplib: Portnummer zur Kommunikation?
Verfasst: Sonntag 21. Januar 2007, 17:18
von to.ni
Hallo zusammen,
EDIT: die Problemstellung hat sich etwas geändert, deshalb neuer/anderer Beitrag...
Ich versuche mich mit der ftplib. Leider klappt aber die Kommunikation mit dem FTP-Server nicht so richtig. Ich kann mich zwar erfolgreich einloggen, kann dann aber keine Daten zum Server senden bzw. von ihm entfangen.
Ich habe das Problem inzwischen auf meine Firewall eingegrenzt. Bei dieser ist konfiguriert, dass Daten über die Ports 20/21 laufen dürfen. Mein FTP-Programm (FileZilla) funktioniert auch, aber die Python ftplib mag nicht so recht. Bei folgendem Code erhalte ich NACH der Willkommensmeldung (diese wird angezeigt!) die Fehlermeldung "timed out":
Code: Alles auswählen
import ftplib
ftp = ftplib.FTP()
ftp.connect("host.de")
ftp.login("username", "passwd")
print ftp.getwelcome()
print ftp.retrlines('LIST')
ftp.quit()
Daher meine Frage: Welche Ports verwendet denn die ftplib zum Datenaustausch? Habe im Internet da nichts passendes gefunden...
Schon mal danke für eure Hilfe...

Verfasst: Montag 22. Januar 2007, 17:42
von Leonidas
Normalerweise ist der FTP-Port 21. Ob die Verbindung funktioniert kannst du aber ganz einfach mit netcat prüfen, indem du dich "per Hand" zum Server verbindest - im Falle von FTP ist das ziemlich einfach. Ich habe erst heute wieder damit eine POP3-Verbindung debuggt, das Tool ist für solche Sachen sehr brauchbar.
Re: ftplib: Portnummer zur Kommunikation?
Verfasst: Montag 22. Januar 2007, 19:14
von gerold
to.ni hat geschrieben:Ich habe das Problem inzwischen auf meine Firewall eingegrenzt. Bei dieser ist konfiguriert, dass Daten über die Ports 20/21 laufen dürfen. Mein FTP-Programm (FileZilla) funktioniert auch, aber die Python ftplib mag nicht so recht.
Hi to.ni!
Code: Alles auswählen
gps ~ # grep ftp /etc/services
ftp-data 20/tcp
ftp 21/tcp
tftp 69/udp
sftp 115/tcp
ftps-data 989/tcp # FTP over SSL (data)
ftps 990/tcp
venus-se 2431/udp # udp sftp side effect
codasrv-se 2433/udp # udp sftp side effect
frox 2121/tcp # frox: caching ftp proxy
zope-ftp 8021/tcp # zope management by ftp
gps ~ #
Port 21 wird auf jeden Fall gebraucht. Port 20 ist auch keine schlechte Idee, allerdings ist es so, dass sich FTP den Datenkanal auch dynamisch ausmachen kann. FileZilla ist normalerweise so eingestellt, dass es den "Passiven Modus" für den Datentransfer verwendet. Was eigentlich solchen Verbindungsschwierigkeiten entgegen wirken sollte.
In der Hilfe steht, dass Python seit Version 2.1 ebenfalls den "Passiven Modus" verwendet. ???
Probier doch mal aus, diesen Modus umzuschalten.
mfg
Gerold

Verfasst: Montag 22. Januar 2007, 19:54
von to.ni
Hi Gerold,
an der Firewall (respektive dem Router) sind die Ports 20/21 geöffnet.
Dass FTP auch über andere Ports kommuniziert ist mir auch noch irgendwie bekannt... wie gesagt, der Login funktioniert, aber Daten kommen halt keine durch.
Habe den passiv-Mode jetzt ohne erfolg getestet:
Code: Alles auswählen
ftp = ftplib.FTP()
ftp.connect("host", 21)
ftp.login("user", "passwd")
ftp.set_debuglevel(1)
ftp.set_pasv(True)
print ftp.getwelcome()
print ftp.retrlines('LIST')
ftp.quit()
Ergebnis:
Code: Alles auswählen
*welcome* '220 (vsFTPd 1.2.0)'
220 (vsFTPd 1.2.0)
*cmd* 'TYPE A'
*resp* '200 Switching to ASCII mode.'
*cmd* 'PASV'
*resp* '227 Entering Passive Mode (80,190,253,157,170,232)'
Traceback (most recent call last):
File "D:\Eigene Dokumente\Projekte\Python\Tests\ftp.py", line 14, in -toplevel-
print ftp.retrlines('LIST')
File "C:\Programme\Python24\Lib\ftplib.py", line 396, in retrlines
conn = self.transfercmd(cmd)
File "C:\Programme\Python24\Lib\ftplib.py", line 345, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Programme\Python24\Lib\ftplib.py", line 324, in ntransfercmd
conn.connect(sa)
File "<string>", line 1, in connect
error: (10060, 'Operation timed out')
Werde jetzt mal an den FileZilla-Einstellungen rumprobieren... kann doch nicht sein!

Verfasst: Montag 22. Januar 2007, 20:04
von to.ni
Ich nehme alles zurück, und behaupte das Gegenteil.
Habe in obigen Code einfach ein "False" für den passiv-Modus eingegeben. und alles funktioniert. Aber warum?
Also nochmal, Lösung:
und es gibt keine Probleme mit der Firewall...
Link zur erwähnten Dokumentation:
http://docs.python.org/lib/ftp-objects.html
thx tobi
Verfasst: Montag 22. Januar 2007, 20:39
von gerold
to.ni hat geschrieben:Habe in obigen Code einfach ein "False" für den passiv-Modus eingegeben. und alles funktioniert. Aber warum?
Hi to.ni!
Wahrscheinlich hast du deine Firewall so konfiguriert, dass sie die Ports 20 und 21 in beide Richtungen durch lässt. Beim "Aktiven Modus" baut der FTP-Server eine Datenverbindung von Port 20 ausgehend zum Client auf.
Im "Passiven Modus" gibt der Server dem Client den Port an, zu dem sich der Client verbinden soll. Dabei ändert sich der Port, von dem aus sich der Client verbindet, ständig. Da dieser Port der Firewall nicht bekannt ist, lässt sie nichts durch.
Oft sind Firewalls so eingestellt, dass sie alle Verbindungen, die von "Innen" aufgebaut werden, nach "Außen" durchlassen. Diese Firewalls sind dann meist so eingestellt, dass sie keine Verbindungen von "Außen" nach "Innen" akzeptieren. In solchen Fällen ist der "Passive Modus" der Richtige. Wenn du aber Verbindungen "von Außen" zulässt (Port 20), aber dafür auch Verbindungen, "nach Außen" einschränkst, dann ist der "Aktive Modus" der Richtige für dich.
Bessere Infos darüber findest du z.B. hier:
-
http://www.iss.net/security_center/advi ... efault.htm
-
http://slacksite.com/other/ftp.html
-
http://www.elektronik-kompendium.de/sit ... 902241.htm
mfg
Gerold

Verfasst: Dienstag 23. Januar 2007, 21:52
von to.ni
Hi Gerold,
merci für deine Antworten und die Links! Werde mir das nochmal zu Gemüte führen...
tobi