Comment se connecter à un serveur FTP à l'aide de Python

Comment se connecter à un serveur FTP à l'aide de Python

FTP (Protocole de transfert de fichiers) n'a pas besoin de présentations: il fait partie des méthodes de transfert de fichiers les plus utilisées entre un ou plusieurs clients et un serveur. Par conception, il prend en charge l'accès et l'authentification anonymes, mais dans sa forme la plus élémentaire, il ne fournit pas de chiffrement des données, c'est pourquoi il est souvent sécurisé via TLS.

De nombreuses applications clients FTP sont disponibles sur Linux, comme par exemple Filezilla (graphique) ou lftp (ligne de commande). Parfois, cependant, nous voulons peut-être accéder à un serveur FTP par programme, peut-être pour planifier des transferts de fichiers. Une façon facile de le faire est d'utiliser un langage de programmation comme Python. Dans ce tutoriel, nous apprendrons à utiliser le ftplib bibliothèque pour interagir avec un serveur FTP.

Dans ce tutoriel, vous apprendrez:

  • Comment créer une instance du FTPLIB.Classe FTP
  • Comment répertorier les fichiers sur un serveur FTP distant
  • Comment télécharger des fichiers en mode binaire et «lignes»
  • Comment télécharger des fichiers en mode binaire et «lignes»
  • Comment créer, supprimer et renommer les répertoires et fichiers
  • Comment changer le répertoire de travail
Comment se connecter à un serveur FTP à l'aide de Python

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Distribution indépendante
Logiciel Python
Autre Aucune autre autorisation requise
Conventions # - nécessite que les commandes Linux sont exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux sont exécutées en tant qu'utilisateur non privilégié régulier

La bibliothèque FTPLIB

Le ftplib Le module fait partie de la bibliothèque standard Python et fournit deux classes principales pour résumer en travaillant avec une connexion FTP: ftblib.FTP et ftplib.Ftp_tls. Ce dernier est une sous-classe du premier et ajoute le support pour TLS. Voyons certains des cas d'utilisation les plus courants de la bibliothèque.

Connexion à un serveur FTP

Pour se connecter à un serveur FTP, la première chose que nous devons faire est de créer une instance du FTP classe. La classe prend en charge le avec déclaration afin qu'il puisse être utilisé avec un gestionnaire de contexte: de cette façon, la connexion sera automatiquement fermée lorsque nous finirons de travailler ou une erreur se produit. Voici un exemple d'utilisation:

avec ftplib.FTP ('FTP.en quelque sorte.com ') as ftp: # codehere 
Copie

Tous les paramètres du FTP Le constructeur de classe est facultatif, mais ici nous avons fourni le premier argument accepté par celui-ci, qui est le héberger Nous voulons nous connecter à. Si l'argument est fourni, le connecter La méthode, utilisée pour établir une connexion avec le serveur, est implicitement appelée avec l'hôte spécifié passé comme argument, sinon il doit être appelé explicitement:

avec ftplib.Ftp () comme ftp: ftp.connecter ('ftp.en quelque sorte.com ') 
Copie

Le deuxième argument accepté par le FTP Le constructeur de classe est le utilisateur Nous voulons nous connecter dans le serveur FTP. Fournir cet argument provoquera le connexion la méthode à appeler implicitement avec le utilisateur, le mot de passe et accorder Les valeurs sont passées comme arguments (ce sont les troisième et quatrième paramètres du constructeur de classe, et par défaut à une chaîne vide comme valeur):

avec ftplib.FTP ('FTP.en quelque sorte.it ',' TesUser ',' TestPassword ') en tant que FTP: # CodeHere 
Copie

Si l'argument n'est pas fourni, le connexion La méthode doit être appelée explicitement:

avec ftplib.FTP ('FTP.en quelque sorte.it ') as ftp: ftp.Login ('TesUser', 'Mot de passe') 
Copie

Obtenir une liste de fichiers sur le serveur

Une fois un FTP l'objet est créé, nous avons essentiellement trois façons d'obtenir une liste des fichiers stockés sur le serveur FTP auquel nous sommes connectés. Tout d'abord, nous pouvons utiliser le diron Méthode, qui produit une liste de répertoire comme renvoyé par le LISTE commande:

>>> avec ftplib.FTP ('FTP.en quelque sorte.it ',' utilisateur ',' mot de passe ') en tant que FTP: ... FTP.dir () 
Copie

Le diron La méthode accepte un argument facultatif, qui est le répertoire à répertorier (la valeur par défaut est le répertoire de travail actuel, donc dans ce cas la racine FTP). Le code ci-dessus produit une sortie similaire à ce qui suit:

DRWXR-XR-X 2 FTP FTP 4096 OCT 13 14:37 . drwxr-xr-x 2 ftp ftp 4096 13 oct 14: 37… -rw ------- 1 ftp ftp 10 sept. 10 06:04 .ftpquota -rw-r - r-- 1 FTP FTP 5306756 18 oct. 01:32 Fichier.CSV 

La deuxième méthode que nous pouvons utiliser pour obtenir une liste de fichiers est nlst. Comme son nom l'indique, cette méthode, sous le capot, envoie un Nlst commande au serveur; Il renvoie une liste Python contenant le nom des fichiers en tant que membres:

>>> avec ftplib.FTP ('FTP.en quelque sorte.it ',' utilisateur ',' mot de passe ') en tant que FTP: ... FTP.nlst () ... ['.','… ','.ftpquota ',' fichier.csv '] 
Copie

La troisième méthode que nous pouvons utiliser pour répertorier le contenu d'un répertoire est MLSD. Cette méthode utilise le MLSD Commande (donc pour qu'elle fonctionne, le serveur doit le prendre en charge) et accepte deux arguments facultatifs:

  • Le chemin du répertoire qui devrait être répertorié
  • Une liste des informations que nous voulons être incluses dans le résultat

La méthode renvoie un Générateur qui donne un Tuple à deux éléments pour chaque fichier: le premier élément de chaque tuple est le nom de fichier; le second A dictionnaire contenant les informations demandées et leurs valeurs. Voyons un exemple:

>>> avec ftplib.FTP ('FTP.en quelque sorte.it ',' utilisateur ',' mot de passe ') en tant que FTP: ... pour le nom de fichier, informations dans FTP.mlsd (): ... Impression (nom de fichier, informations) 
Copie

La sortie du code ci-dessus est la suivante:

. 'type': 'cdir', 'sizd': '4096', 'modifier': '20201013123732', 'Unix.Mode ':' 0755 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' unique ':' fd04g58e0a67 '… ' type ':' pdir ',' sizd ':' 4096 ',' modifier ':' 20201013123732 ',' Unix.Mode ':' 0755 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' unique ':' fd04g58e0a67 ' .ftpquota 'type': 'file', 'size': '10', 'modifier': '20200910040430', 'Unix.Mode ':' 0600 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' Unique ':' FD04G58E0A9D ' Fichier.csv 'type': 'file', 'size': '5306756', 'modifier': '20201017233245', 'Unix.Mode ':' 0644 ',' Unix.uid ':' 1809 ',' Unix.gid ':' 1811 ',' unique ':' fd04g58e020a ' 

Notez que le serveur n'est pas assuré de respecter la liste des informations que nous demandons.

Récupération des fichiers du serveur

Pour récupérer des fichiers du serveur, nous pouvons utiliser le rétrbinaire ou retlines méthodes. Voyons comment ils fonctionnent.

Le rétrbinaire La méthode récupère un fichier en mode de transfert binaire: c'est ce que vous voulez utiliser pour simplement télécharger un fichier depuis le serveur vers votre machine locale et n'avez pas besoin d'interagir avec son contenu. Voyons un exemple de son utilisation. Dites que nous voulons télécharger le déposer.CSV à partir du serveur; Nous écrivions simplement:

>>> avec ftplib.FTP ('FTP.en quelque sorte.it ',' utilisateur ',' mot de passe ') en tant que FTP: ... avec Open ('Fichier.CSV ',' WB ') comme téléchargé_file: ... FTP.Retrbinary ('Fichier RET.csv ', téléchargé_file.écrire) ... '226-fichier transféré avec succès \ n226 0.823 secondes (mesurées ici), 6.15 mytes par seconde ' 
Copie

Dans l'exemple ci-dessus, nous avons ouvert un dossier local pour écrire mode binaire
(déposer.CSV) en utilisant un gestionnaire de contexte, alors appelé le rétrbinaire Passe méthode
un approprié Rétractation la commande comme premier argument (Ret Nameofthefile), et le
écrire Méthode de l'objet de fichier fichier téléchargé comme le deuxième argument, qui
est un rappeler appliqué à chaque morceau de données reçues.

En parlant de morceaux de données, la taille maximale du bloc utilisée pour le transfert
de données, par défaut, est 8192 octets. Cela, cependant, peut être modifié via le
troisième paramètre facultatif du rétrbinaire méthode.

Le rétlie La méthode fonctionne un peu différemment, car elle récupère les fichiers en mode «ligne». Le premier argument de cette méthode peut être un Rétractation commande, tout comme celle que nous avons utilisée dans l'exemple précédent, mais aussi un LISTE (pour récupérer une liste de noms de fichiers et d'informations à leur sujet) ou Nlst (Récupérer juste des noms de fichiers). Le deuxième argument de la méthode est facultatif et est un rappel qui est appliqué à chaque ligne récupérée (le comportement par défaut est d'imprimer les lignes pour stdout). Il est important de remarquer que chaque ligne est dépouillée du caractère de fin de ligne, qui sur Linux est \ n.

Voyons un exemple. Si nous utilisons le retlines Méthode, nous pouvons récupérer le contenu du déposer.CSV Fichier ligne par ligne:

>>> Importer OS >>> avec ftplib.Ftp ('hôte', 'utilisateur', 'mot de passe') en tant que FTP: ... avec Open ('Fichier.csv ',' w ') comme csvfile: ... FTP.Rétlines (Fichier «RET.CSV ', Lambda X: CSfile.écrire("".rejoindre ([x, os.ligne de ligne]))) ... 
Copie

Dans l'exemple ci-dessus, nous avons importé le OS Module, alors, comme avant, nous avons créé un fichier localement, cette fois en mode textuel. Avec le FTP.rétlie méthode nous avons récupéré le déposer.CSV Fichier distant ligne par ligne. Le rappel que nous avons utilisé comme deuxième argument du rétlie est un lambda fonction qui prend la ligne comme argument et appelle le écrire Méthode de la csvfile objet pour écrire la ligne jointe au ligne de ligne Caractère approprié pour le système d'exploitation, dont nous avons accédé OS.ligne de ligne.

Nous pouvons utiliser le rappel pour modifier également le contenu du fichier à la volée. À titre d'exemple trivial, imaginez que nous voulons en majuscules chaque mots contenus dans le fichier distant lorsque nous le stockons localement. Nous pourrions écrire:

[...]] ... FTP.Rétlines (Fichier «RET.CSV ', Lambda X: CSfile.écrire("".rejoindre ([x.supérieur (), OS.ligne de ligne]))) 
Copie

Cette méthode, comme nous l'avons déjà mentionné, peut également être utilisée pour travailler avec les lignes renvoyées par le LISTE ou Nlst commandes. Supposons que nous voulons enregistrer le résultat de la liste d'un répertoire sur le serveur distant dans un fichier local:

>>> avec ftplib.Ftp ('hôte', 'utilisateur', 'mot de passe') en tant que FTP: ... avec open ('list_result', 'w') comme localfile: ... FTP.Retrlines ('List', Lambda X: Localfile.écrire("".rejoindre ([x, os.ligne de ligne]))) 
Copie

Le fichier local list_result sera créé (ou tronqué et écrasé s'il existe déjà), et son contenu sera quelque chose de similaire à:

DRWXR-XR-X 2 FTP FTP 4096 OCT 13 14:37 . drwxr-xr-x 2 ftp ftp 4096 13 oct 14: 37… -rw ------- 1 ftp ftp 10 sept. 10 06:04 .ftpquota -rw-r - r-- 1 FTP FTP 5306756 18 oct. 01:32 Fichier.CSV 

Téléchargement de fichiers sur le serveur

Lorsque nous devons télécharger un fichier sur un serveur FTP, nous pouvons également choisir de le faire en mode binaire ou «lignes». Les deux méthodes que nous pouvons utiliser pour accomplir la tâche sont respectivement: magasin et carnulines.

Le magasin Méthode de la FTP La classe prend deux arguments obligatoires Stop Commande, et l'objet de fichier créé à partir d'un fichier local ouvert en mode binaire. Supposons que nous voulons télécharger un fichier; Nous écrivions:

>>> avec ftplib.Ftp ('hôte', 'utilisateur', 'mot de passe') en tant que FTP: ... avec ouvert ('LinuxConfig.txt ',' rb ') as file_object: ... FTP.Storbinary ('Stor LinuxConfig.txt ', file_object) 
Copie

Vraiment simple! Bien sûr, nous pouvons également stocker le fichier sur le serveur avec un nom différent. L'objet de fichier a passé comme deuxième argument du storbinaire La méthode est lue jusqu'à EOF. Comme dans le cas du rétrbinaire Méthode, il est possible de modifier la taille des morceaux de données, avec le troisième argument en option (la valeur par défaut, est, encore une fois 8192 octets). Le quatrième argument accepté par le storbinaire Méthode, est une facteur rappeler fonction qui est appliquée à chaque morceau de données.

Pour télécharger un fichier ligne par ligne, nous pouvons utiliser le storlines Méthode à la place. Dans ce cas, le fichier que nous voulons télécharger sera lut par ligne. Les deux premiers arguments sont les mêmes acceptés par le storbinaire Méthode, tandis que le troisième (et le dernier) est un rappeler qui est appliqué à chaque ligne.

Naviguer, créer des répertoires, supprimer et renommer des fichiers

Le FTP classe (et le Ftp_tls classe qui l'étend) fournit également des méthodes très utiles pour effectuer certaines des opérations les plus courantes. Par exemple, pour créer un répertoire sur le serveur FTP distant, nous pouvons utiliser le MKD Méthode qui prend le chemin d'accès du répertoire pour créer comme son seul argument:

>>> FTP.MKD ('newdir') 'newdir' 
Copie

Pour modifier le répertoire de travail, nous pouvons utiliser le CWD Méthode, passant le nom du répertoire dans lequel nous voulons entrer comme argument:

>>> FTP.cwd ('newdir') '250 ok. Le répertoire actuel est / newdir ' 
Copie

Pour supprimer un répertoire existant, nous pouvons utiliser le RMD Méthode, passant le nom du répertoire à supprimer:

>>> FTP.RMD ('newdir') '250 Le répertoire a été supprimé avec succès' 
Copie

Pour supprimer un fichier régulier, nous pouvons utiliser le supprimer Méthode à la place, en passant le nom du fichier à supprimer comme argument:

>>> FTP.supprimer le fichier.CSV ')' 250 Fichier supprimé.csv ' 
Copie

Pour renommer les fichiers ou les répertoires, nous pouvons utiliser le Renommer méthode. Il accepte deux arguments: le premier est le nom actuel du fichier ou du répertoire, le second est le nouveau. Renommer déposer.CSV pour fichier0.CSV, Par exemple, nous écrivions:

>>> FTP.renommer le fichier.csv ',' file0.CSV ')' 250 fichier avec succès renommé ou déplacé ' 
Copie

Fermer une connexion manuellement

Comme nous l'avons déjà appris, le FTP La classe peut être utilisée avec un gestionnaire de contexte, de sorte que la connexion est automatiquement fermée lorsque l'interprète quitte le avec bloc de déclaration. Dans les cas où nous devons fermer la connexion manuellement, cependant, nous devons utiliser le arrêter Méthode: il appelle le fermer Méthode en interne et envoie un ARRÊTER Commande au serveur pour essayer de fermer la connexion gracieusement.

Conclusions

Dans cet article, nous avons appris à utiliser le python ftplib module afin de se connecter à un serveur FTP et d'interagir avec lui. Nous avons vu comment créer une instance du FTP classe et quelles sont les méthodes que nous pouvons utiliser pour répertorier le contenu d'un répertoire distant et télécharger / télécharger des fichiers. Nous avons également vu comment créer, supprimer, renommer et supprimer des répertoires ou des fichiers et comment modifier le répertoire de travail. Dans ce tutoriel, nous avons exploré les cas d'utilisation les plus courants, pour une liste complète des fonctionnalités, veuillez visiter la page officielle de libftp.

Tutoriels Linux connexes:

  • Tutoriel LFTP sur Linux avec des exemples
  • Liste des clients FTP et installation sur Ubuntu 20.04 Linux…
  • Liste des clients FTP et installation sur Ubuntu 22.04 Linux…
  • Comment configurer un serveur OpenVPN sur Ubuntu 20.04
  • Ubuntu 20.04: Liste des clients torrent
  • Ubuntu 22.04: Liste des clients torrent
  • Configuration du serveur FTP sur Linux
  • Choses à installer sur Ubuntu 20.04
  • Comment configurer vsftpd sur Debian
  • Comment configurer le serveur et le client FTP / SFTP sur Almalinux