Verbinding maken met een FTP-server met Python

  • Dylan Parker
  • 0
  • 1181
  • 254
>

FTP (File Transfer Protocol) heeft geen presentaties nodig: het is een van de meest gebruikte methoden voor bestandsoverdracht tussen een of meer clients en een server. Door zijn ontwerp ondersteunt het zowel anonieme toegang als authenticatie, maar in de meest basale vorm biedt het geen gegevensversleuteling, daarom is het vaak beveiligd via TLS.

Er zijn veel FTP-clienttoepassingen beschikbaar op Linux, zoals bijvoorbeeld Filezilla (grafisch) of lftp (opdrachtregel). Soms willen we echter programmatisch toegang krijgen tot een FTP-server, bijvoorbeeld om bestandsoverdrachten te plannen. Een eenvoudige manier om dit te doen, is door een programmeertaal zoals Python te gebruiken. In deze tutorial zullen we leren hoe we de ftplib bibliotheek om te communiceren met een FTP-server.

In deze tutorial leer je:

  • Hoe een instantie van de ftplib.FTP-klasse te maken
  • Bestanden weergeven op een externe FTP-server
  • Hoe bestanden in binaire en "lijnen" -modus te uploaden
  • Bestanden downloaden in binaire en "lijnen" -modus
  • Mappen en bestanden maken, verwijderen en hernoemen
  • Hoe de werkmap te veranderen
Hoe verbinding te maken met een FTP-server met Python

Gebruikte softwarevereisten en -conventies

Softwarevereisten en Linux Command Line-conventies
Categorie Vereisten, conventies of gebruikte softwareversie
Systeem Distributie onafhankelijk
Software Python
Andere Geen andere machtigingen vereist
Conventies # - vereist dat gegeven linux-commando's worden uitgevoerd met root-privileges, hetzij direct als rootgebruiker, hetzij door gebruik van sudo opdracht
$ - vereist dat gegeven linux-commando's worden uitgevoerd als een gewone niet-geprivilegieerde gebruiker

De ftplib-bibliotheek

De ftplib module maakt deel uit van de Python-standaardbibliotheek en biedt twee hoofdklassen om abstract te werken met een FTP-verbinding: ftblib.FTP en ftplib.FTP_TLS. De laatste is een subklasse van de eerste en voegt ondersteuning toe voor TLS. Laten we eens kijken naar enkele van de meest voorkomende gebruikssituaties van de bibliotheek.

Verbinding maken met een FTP-server

Om verbinding te maken met een FTP-server, moeten we eerst een instantie van het FTP klasse. De klasse ondersteunt het met statement, zodat het kan worden gebruikt met een contextmanager: op deze manier wordt de verbinding automatisch verbroken als we klaar zijn met werken of als er een fout optreedt. Hier is een gebruiksvoorbeeld:

met ftplib.FTP ('ftp.somehost.com') als ftp: # codehere 

Alle parameters van het FTP class constructor zijn optioneel, maar hier hebben we het eerste argument opgegeven, namelijk de gastheer waarmee we verbinding willen maken. Als het argument wordt opgegeven, is de aansluiten methode, gebruikt om een ​​verbinding met de server tot stand te brengen, wordt impliciet aangeroepen met de opgegeven host doorgegeven als argument, anders zou het expliciet moeten worden aangeroepen:

met ftplib.FTP () als ftp: ftp.connect ('ftp.somehost.com') 

Het tweede argument dat door de FTP class constructor is de gebruiker we willen inloggen als in de ftp-server. Als u dit argument opgeeft, wordt het Log in methode die impliciet wordt aangeroepen met de gebruiker, de wachtwoord en acct waarden die als argumenten zijn doorgegeven (dit zijn de derde en vierde parameters van de klassenconstructor, en standaard een lege string als waarde):

met ftplib.FTP ('ftp.somehost.it', 'testuser', 'testpassword') als ftp: # codehere 

Als het argument niet wordt opgegeven, is de Log in methode moet expliciet worden aangeroepen:

met ftplib.FTP ('ftp.somehost.it') als ftp: ftp.login ('testuser', 'wachtwoord') 

Een lijst met bestanden op de server ophalen

Eens een FTP object is gemaakt, hebben we in principe drie manieren om een ​​lijst te krijgen van de bestanden die zijn opgeslagen op de FTP-server waarmee we zijn verbonden. Allereerst kunnen we de richt methode, die een directorylijst produceert zoals geretourneerd door de LIJST opdracht:

>>> met ftplib.FTP ('ftp.somehost.it', 'gebruiker', 'wachtwoord') als ftp:… ftp.dir () 

De richt methode accepteert een optioneel argument, namelijk de directory die moet worden weergegeven (de standaard is de huidige werkdirectory, dus in dit geval de FTP-root). De bovenstaande code produceert een output die lijkt op de volgende:

drwxr-xr-x 2 ftp ftp 4096 13 okt 14:37. drwxr-xr-x 2 ftp ftp 4096 okt 13 14:37… -rw ------- 1 ftp ftp 10 sep 10 06:04 .ftpquota -rw-r - r-- 1 ftp ftp 5306756 okt 18 01:32 bestand.csv 

De tweede methode die we kunnen gebruiken om een ​​lijst met bestanden te verkrijgen, is nlst. Zoals de naam suggereert, stuurt deze methode, onder de motorkap, een NLST commando naar de server; het retourneert een Python-lijst met de naam van de bestanden als leden:

>>> met ftplib.FTP ('ftp.somehost.it', 'gebruiker', 'wachtwoord') als ftp:… ftp.nlst ()… ['.', '…', '.ftpquota', 'bestand .csv '] 

De derde methode die we kunnen gebruiken om de inhoud van een map weer te geven, is mlsd. Deze methode maakt gebruik van de MLSD commando (dus om het te laten werken, moet de server het ondersteunen), en accepteert twee optionele argumenten:

  • De pad van de directory die moet worden vermeld
  • Een lijst met de informatie die we in het resultaat willen opnemen

De methode retourneert een generator wat een twee-elementen tupel voor elk bestand: het eerste element van elk tupel is de bestandsnaam; de tweede een woordenboek met de gevraagde informatie en hun waarden. Laten we een voorbeeld bekijken:

>>> met ftplib.FTP ('ftp.somehost.it', 'gebruiker', 'wachtwoord') als ftp: ... voor bestandsnaam, informatie in ftp.mlsd (): ... print (bestandsnaam, informatie) 


De output van de bovenstaande code is de volgende:

. 'type': 'cdir', 'sizd': '4096', 'wijzigen': '20201013123732', 'unix.mode': '0755', 'unix.uid': '1809', 'unix.gid' : '1811', 'uniek': 'fd04g58e0a67'… 'type': 'pdir', 'sizd': '4096', 'wijzigen': '20201013123732', 'unix.mode': '0755', ' unix.uid ':' 1809 ',' unix.gid ':' 1811 ',' uniek ':' fd04g58e0a67 ' .ftpquota ' type ':' bestand ',' grootte ':' 10 ',' wijzigen ': '20200910040430', 'unix.mode': '0600', 'unix.uid': '1809', 'unix.gid': '1811', 'uniek': 'fd04g58e0a9d' file.csv 'type': 'file', 'size': '5306756', 'wijzigen': '20201017233245', 'unix.mode': '0644', 'unix.uid': '1809', 'unix.gid': '1811', 'uniek': 'fd04g58e020a' 

Merk op dat het niet gegarandeerd is dat de server de lijst met gevraagde informatie respecteert.

Ophalen van bestanden van de server

Om bestanden van de server op te halen, kunnen we de retrbinary of retlines methoden. Laten we eens kijken hoe ze werken.

De retrbinary methode haalt bestanden op in binaire overdrachtsmodus: dit is wat u wilt gebruiken om eenvoudig een bestand van de server naar uw lokale machine te downloaden en hoeft geen interactie te hebben met de inhoud ervan. Laten we een voorbeeld van het gebruik ervan bekijken. Stel dat we het bestand.csv van de server; we zouden gewoon schrijven:

>>> met ftplib.FTP ('ftp.somehost.it', 'gebruiker', 'wachtwoord') als ftp: ... met open ('file.csv', 'wb') als gedownload_bestand:… ftp.retrbinary (' RETR file.csv ', download_file.write) ...' 226-Bestand succesvol overgedragen \ n226 0,823 seconden (hier gemeten), 6,15 Mbytes per seconde ' 

In het bovenstaande voorbeeld hebben we een lokaal bestand geopend om in te schrijven binaire modus (bestand.csv) met behulp van een contextmanager en vervolgens de retrbinary methode passeren van een geschikt RETR commando als eerste argument (RETR-naam van het bestand), en de schrijven methode van het bestandsobject gedownload bestand als het tweede argument, namelijk een Bel terug toegepast op elk brok ontvangen gegevens.

Over data chunks gesproken, de maximale blokgrootte die wordt gebruikt voor de overdracht van data is standaard 8192 bytes. Dit kan echter worden gewijzigd via de optionele derde parameter van het retrbinary methode.

De retrlines methode werkt een beetje anders, aangezien het bestanden ophaalt in "lijn" -modus. Het eerste argument van deze methode kan geldig zijn RETR commando, net als degene die we in het vorige voorbeeld hebben gebruikt, maar ook een LIJST (om een ​​lijst met bestandsnamen en informatie over hen op te halen) of NLST (haal alleen bestandsnamen op). Het tweede argument van de methode is optioneel en is een callback die wordt toegepast op elke opgehaalde regel (standaardgedrag is om regels af te drukken naar stdout). Het is belangrijk op te merken dat elke regel is ontdaan van het einde van de regel, wat onder Linux het geval is \ n.

Laten we een voorbeeld bekijken. Als we de retlines methode, kunnen we de inhoud van de bestand.csv bestand regel voor regel:

>>> os importeren >>> met ftplib.FTP ('host', 'gebruiker', 'wachtwoord') als ftp: ... met open ('file.csv', 'w') als csvfile: ... ftp.retrlines ( 'RETR file.csv', lambda x: csfile.write ("". Join ([x, os.linesep]))) ... 

In het bovenstaande voorbeeld hebben we het os module, dan hebben we, net als voorheen, een bestand lokaal gemaakt, dit keer in tekstuele modus. Met de ftp.retrlines methode hebben we de bestand.csv extern bestand regel voor regel. De callback die we hebben gebruikt als tweede argument van de retrlines is een lambda functie die de regel als argument neemt en de schrijven methode van de csvfile object om de regel te schrijven die is samengevoegd met de lineep teken dat geschikt is voor de Os, waartoe we toegang hebben gehad os.linesep.

We kunnen de callback gebruiken om ook de inhoud van het bestand direct te wijzigen. Als een triviaal voorbeeld, stel je voor dat we elk woord in het externe bestand in hoofdletters willen schrijven wanneer we het lokaal opslaan. We zouden kunnen schrijven:

[…]… Ftp.retrlines ('RETR file.csv', lambda x: csfile.write ("". Join ([x.upper (), os.linesep]))) 

Deze methode, zoals we al zeiden, kan worden gebruikt om ook te werken met de regels die worden geretourneerd door de LIJST of NLST commando's. Stel dat we het resultaat van het aanbieden van een directory op de externe server willen opslaan in een lokaal bestand:

>>> met ftplib.FTP ('host', 'gebruiker', 'wachtwoord') als ftp: ... met open ('lijst_result', 'w') als lokaal bestand:… ftp.retrlines ('LIST', lambda x: localfile.write ("". join ([x, os.linesep]))) 

Het lokale bestand list_result zal worden gemaakt (of afgekapt en overschreven als het al bestaat), en de inhoud zal er ongeveer zo uitzien als:

drwxr-xr-x 2 ftp ftp 4096 13 okt 14:37. drwxr-xr-x 2 ftp ftp 4096 okt 13 14:37… -rw ------- 1 ftp ftp 10 sep 10 06:04 .ftpquota -rw-r - r-- 1 ftp ftp 5306756 okt 18 01:32 bestand.csv 

Bestanden uploaden naar de server

Als we een bestand naar een FTP-server moeten uploaden, kunnen we er ook voor kiezen om dit in binaire of "lijnen" -modus te doen. De twee methoden die we kunnen gebruiken om de taak te volbrengen, zijn respectievelijk: storebinary en opslaglijnen.

De storebinary methode van de FTP class heeft twee verplichte argumenten die geldig zijn STOR commando, en het bestandsobject gemaakt op basis van een lokaal bestand geopend in binaire modus. Stel dat we een bestand willen uploaden; we zouden schrijven:

>>> met ftplib.FTP ('host', 'gebruiker', 'wachtwoord') als ftp: ... met open ('linuxconfig.txt', 'rb') als file_object: ... ftp.storbinary ('STOR linuxconfig.txt ', file_object) 


Heel simpel! Natuurlijk kunnen we het bestand ook onder een andere naam op de server opslaan. Het bestandsobject is doorgegeven als het tweede argument van het storbinary methode wordt gelezen tot EOF. Net als in het geval van de retrbinary methode, is het mogelijk om de grootte van het gegevensblok te wijzigen met het optionele derde argument (de standaardinstelling is wederom 8192 bytes). Het vierde argument dat door de storbinary methode, is optioneel Bel terug functie die wordt toegepast op elk stuk gegevens.

Om een ​​bestand regel voor regel te uploaden, kunnen we de winkellijnen methode in plaats daarvan. In dit geval wordt het bestand dat we willen uploaden regel voor regel gelezen. De eerste twee argumenten zijn dezelfde als geaccepteerd door de storbinary methode, terwijl de derde (en laatste) een Bel terug dat wordt toegepast op elke regel.

Navigeren, mappen aanmaken, bestanden verwijderen en hernoemen

De FTP class (en de FTP_TLS class die het uitbreidt) biedt ook enkele zeer nuttige methoden om enkele van de meest voorkomende bewerkingen uit te voeren. Om bijvoorbeeld een map op de externe FTP-server te maken, kunnen we de mkd methode die de padnaam van de te maken map als enige argument gebruikt:

>>> ftp.mkd ('newdir') 'newdir' 

Om de werkdirectory te wijzigen, kunnen we de cwd methode, waarbij de naam van de map waarnaar we willen gaan als argument doorgeven:

>>> ftp.cwd ('newdir') '250 OK. Huidige map is / newdir ' 

Om een ​​bestaande directory te verwijderen, kunnen we de rmd methode, door de naam van de te verwijderen directory door te geven:

>>> ftp.rmd ('newdir') '250 De map is succesvol verwijderd' 

Om een ​​gewoon bestand te verwijderen, kunnen we de verwijderen methode, door de naam van het te verwijderen bestand door te geven als argument:

>>> ftp.delete ('file.csv') '250 Verwijderd bestand.csv' 

Om bestanden of mappen te hernoemen, kunnen we de hernoemen methode. Het accepteert twee argumenten: de eerste is de huidige naam van het bestand of de map, de tweede is de nieuwe. Om te hernoemen bestand.csv naar bestand0.csv, we zouden bijvoorbeeld schrijven:

>>> ftp.rename ('file.csv', 'file0.csv') '250 Bestand succesvol hernoemd of verplaatst' 

Handmatig een verbinding verbreken

Zoals we al hebben geleerd, is de FTP class kan worden gebruikt met een contextmanager, zodat de verbinding automatisch wordt verbroken wanneer de interpreter het met instructieblok. In gevallen waarin we de verbinding echter handmatig moeten sluiten, moeten we de stoppen methode: het roept de dichtbij methode intern, en stuurt een STOPPEN opdracht aan de server om te proberen de verbinding netjes te sluiten.

Conclusies

In dit artikel hebben we geleerd hoe we de python moeten gebruiken ftplib module om verbinding te maken met een FTP-server en ermee te communiceren. We hebben gezien hoe u een instantie van het FTP class en wat zijn de methoden die we kunnen gebruiken om de inhoud van een externe map weer te geven en bestanden te uploaden / downloaden. We hebben ook gezien hoe u mappen of bestanden kunt maken, verwijderen, hernoemen en verwijderen en hoe u de werkmap kunt wijzigen. In deze tutorial hebben we de meest voorkomende gebruiksscenario's onderzocht. Voor een volledige lijst met functies, bezoek de officiële libftp-pagina.




Niemand heeft nog op dit artikel gereageerd.

Een verzameling nuttige informatie over het Linux-besturingssysteem en nieuwe technologieën
Nieuwe artikelen, praktische tips, gedetailleerde recensies en handleidingen. Voel je thuis in de wereld van het Linux-besturingssysteem