FTP - Datei mit GET oder RECV laden

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
f3yb4la
User
Beiträge: 11
Registriert: Samstag 8. Februar 2020, 15:13

Samstag 8. Februar 2020, 15:26

Hallo liebes Forum,

gleich vorweg - bin absoluter Neueinsteiger in Python und probiere mich gerade an meinem ersten Skript.

Bin mittlerweile schier am Verzweifeln. Möchte eine Datei von einem FTP Server eines Solarwechselrichters laden. "Händisch" via cmd ist schon alles mal durchgespielt und funktioniert, nur leider nicht über das Python Skript. Problem ist, dass vom Server nur GET und RECV unterstützt werden.

Hab schon viel versucht von ftp.retrbinary über ftp.sendcmd, die ftputil lib bis urllib.urlretreive... alles ohne Erfolg.

Könnt ihr mir also helfen eine einfache log datei via GET oder RECV vom Server zu laden?

Danke!
Benutzeravatar
sparrow
User
Beiträge: 1757
Registriert: Freitag 17. April 2009, 10:28

Samstag 8. Februar 2020, 15:56

In der Standardbibliothek ist ein Modul zum Umgang mit FTP: ftplib
Sirius3
User
Beiträge: 11615
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 8. Februar 2020, 18:09

Was hast Du genau versucht und was war die Fehlermeldung? FTP kann hakelig sein und ohne die genauen Meldungen kann man schlecht helfen.
f3yb4la
User
Beiträge: 11
Registriert: Samstag 8. Februar 2020, 15:13

Samstag 8. Februar 2020, 18:27

Danke für die schnellen Antworten. Verwende schon die ftplib.

Hier mal die Fehler:
Traceback (most recent call last):
File "test2.py", line 64, in <module>
ftp.retrbinary('RECV 08.log', open(filename, "wb").write)
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 425, in retrbinary
with self.transfercmd(cmd, rest) as conn:
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 382, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 342, in ntransfercmd
host, port = self.makepasv()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 320, in makepasv
host, port = parse227(self.sendcmd('PASV'))
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 275, in sendcmd
return self.getresp()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 238, in getresp
resp = self.getmultiline()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 224, in getmultiline
line = self.getline()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 206, in getline
line = self.file.readline(self.maxline + 1)
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 669, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen

Schicke morgen nochmal ein Fehlerprotokoll.

Danke für die Hilfe!
Benutzeravatar
__blackjack__
User
Beiträge: 5535
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 8. Februar 2020, 19:06

@f3yb4la: Wie kommst Du auf GET oder RECV? Das sind beides keine gültigen Kommandos. Du willst RETR verwenden. Hast Du die Dokumentation des `ftplib`-Moduls mal angeschaut? Da ist gleich am Anfang ein Beispiel.

Das mit dem ``open("dateiname", "rb").write`` sollte man nicht machen, weil man auf diese Weise die Datei nicht wieder schliessen kann. Das sollte man aber tun.
long long ago; /* in a galaxy far far away */
f3yb4la
User
Beiträge: 11
Registriert: Samstag 8. Februar 2020, 15:13

Samstag 8. Februar 2020, 20:01

Wie komme ich auf GET oder RECV - Hab das ganze ja vorab über cmd probiert und da wurde RETR als ungültiger Befehl quittiert. Über ? wird die Liste der zulässigen Befehle ausgegeben und da war eben GET und RECV aufgelistet. Mit beiden Kommandos hab ich das File lokal kopiert bekommen. Daher war meine (vielleicht falsche) Annahme, dass ich einen der beiden Befehle auch über Python absetzen muss.
Benutzeravatar
__blackjack__
User
Beiträge: 5535
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 8. Februar 2020, 20:30

@f3yb4la: Du vermischt hier Kommandos von irgendeinem FTP-Client mit den Kommandos die im FTP-Protokoll definiert sind.
long long ago; /* in a galaxy far far away */
f3yb4la
User
Beiträge: 11
Registriert: Samstag 8. Februar 2020, 15:13

Sonntag 9. Februar 2020, 20:21

Ok, auch wenn ich da was vermische - wie würde es denn richtig gehen?
Wie würdet ihr das Problem lösen?
__deets__
User
Beiträge: 7700
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 9. Februar 2020, 20:36

Hast du denn RETR versucht?
f3yb4la
User
Beiträge: 11
Registriert: Samstag 8. Februar 2020, 15:13

Sonntag 9. Februar 2020, 20:54

Ja - sowohl als Argument in der ftp.retrbinary als auch direkt über die Konsole. Ging beides mal nicht.
__deets__
User
Beiträge: 7700
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 9. Februar 2020, 21:25

Was heißt denn geht nicht? In dem Code oben steht ein “RECV” vor dem Dateinamen. Gehört das dahin? Und wenn nicht, was passiert ohne?
Benutzeravatar
sparrow
User
Beiträge: 1757
Registriert: Freitag 17. April 2009, 10:28

Montag 10. Februar 2020, 06:36

Zeig doch mal deinen Code und die Fehlermeldung.
Wir würden das so lösen, wie es in der Dokumentation steht.
f3yb4la
User
Beiträge: 11
Registriert: Samstag 8. Februar 2020, 15:13

Montag 10. Februar 2020, 13:19

Danke nochmal für die Rückmeldungen.

Das wäre der Code

import ftplib
import os

ipadr = '192.168.178.99'
ftp_user = 'refu'
ftp_passwd = 'EE0129'

ftp = ftplib.FTP(ipadr, ftp_user, ftp_passwd, timeout=100)
ftp.cwd('/data/logger/2020/02')
filedata = open('09.log', 'wb')
ftp.retrbinary('RETR 09.log', filedata.write)
filedata.close()
ftp.quit()

und hier wäre die Ausgabe

Traceback (most recent call last):
File "test3.py", line 11, in <module>
ftp.retrbinary('RETR 09.log', filedata.write)
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 425, in retrbinary
with self.transfercmd(cmd, rest) as conn:
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 382, in transfercmd
return self.ntransfercmd(cmd, rest)[0]
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 342, in ntransfercmd
host, port = self.makepasv()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 320, in makepasv
host, port = parse227(self.sendcmd('PASV'))
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 275, in sendcmd
return self.getresp()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 238, in getresp
resp = self.getmultiline()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 224, in getmultiline
line = self.getline()
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\ftplib.py", line 206, in getline
line = self.file.readline(self.maxline + 1)
File "C:\Users\xxx\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 669, in readinto
return self._sock.recv_into(b)
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen

Hab mich an den Beispielen die man so im Netz findet orientiert und komme einfach nicht drauf was hier falsch ist.
Sirius3
User
Beiträge: 11615
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 10. Februar 2020, 13:36

Das Kommando fliegt schon bei PASV raus, was darauf hindeutet, dass der FTP-Server keinen Passiv-Modus unterstützt.
Du brauchst also ftp.set_pasv(False).
Und eine Datei mit dem Namen "RET 09.log" gibt es wahrscheinlich nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 5535
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 10. Februar 2020, 20:53

Grmpf, vielleicht sollten die helfenden auch mal in die Dokumentation schauen, da ist gleich am Anfang ein entsprechendes Beispiel: RETR ist ein FTP-Befehl und der muss da stehen. Nicht nur der Dateiname, sondern auch der FTP-Befehl davor. Komische API, ist aber so.
long long ago; /* in a galaxy far far away */
Antworten