Aller au contenu

Script Python pour envoi FTP

Dans les environnements de production, automatiser le transfert de fichiers de manière sécurisée et fiable est essentiel. Cet article explore comment créer un script Python pour transférer des fichiers via FTP, avec une connexion sécurisée, une journalisation des événements, des tentatives automatiques, et des pratiques de sécurité basées sur les variables d’environnement. Avec ce script, vous pouvez vous assurer que vos fichiers sont transférés en toute sécurité vers les serveurs FTP sans compromettre la sécurité ou la stabilité des données.


Pourquoi utiliser Python pour les transferts FTP ?

La bibliothèque ftplib de Python offre une solution puissante et flexible pour interagir avec les serveurs FTP. Cependant, en production, la gestion des erreurs, la journalisation et la sécurisation des transferts sont essentiels. Ce script est conçu avec des fonctionnalités de niveau production, telles que :

  1. Stockage des identifiants dans les variables d’environnement : Évitez de coder en dur les informations sensibles.
  2. Journalisation : Enregistrez chaque étape du transfert, de la connexion à l’achèvement, dans des fichiers de log.
  3. Tentatives automatiques : Gérez les problèmes de réseau avec des tentatives répétées.
  4. Connexion FTP sécurisée : Utilisez TLS pour des transferts de fichiers cryptés.
import ftplib
import os
import logging
from time import sleep
from dotenv import load_dotenv  # Install with 'pip install python-dotenv'

# Load environment variables for security
load_dotenv()

# Configure logging
logging.basicConfig(filename="ftp_upload.log", level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")

def upload_file_ftp(ftp_host, ftp_user, ftp_password, local_file_path, remote_file_path, retries=3, delay=5):
    # Check if the local file exists
    if not os.path.isfile(local_file_path):
        logging.error(f"Local file '{local_file_path}' not found.")
        return

    attempt = 0
    while attempt < retries:
        try:
            # Secure FTP connection using FTP_TLS
            with ftplib.FTP_TLS(ftp_host) as ftp:
                ftp.login(user=ftp_user, passwd=ftp_password)
                ftp.prot_p()  # Switch to secure data connection
                logging.info(f"Connected to FTP server: {ftp_host}")

                # Change to the target directory if needed
                remote_dir = os.path.dirname(remote_file_path)
                if remote_dir:
                    ftp.cwd(remote_dir)
                    logging.info(f"Changed to remote directory: {remote_dir}")

                # Open the file in binary mode and upload it
                with open(local_file_path, "rb") as file:
                    ftp.storbinary(f"STOR {os.path.basename(remote_file_path)}", file)
                    logging.info(f"File '{local_file_path}' uploaded to '{remote_file_path}' successfully.")
                return

        except ftplib.all_errors as e:
            attempt += 1
            logging.warning(f"FTP error on attempt {attempt}: {e}")
            if attempt < retries:
                logging.info(f"Retrying in {delay} seconds...")
                sleep(delay)
            else:
                logging.error("Failed to upload file after multiple attempts.")

if __name__ == "__main__":
    # Retrieve FTP credentials from environment variables
    ftp_host = os.getenv("FTP_HOST")
    ftp_user = os.getenv("FTP_USER")
    ftp_password = os.getenv("FTP_PASSWORD")
    
    # File paths (update these as needed)
    local_file_path = "path/to/local_file.txt"
    remote_file_path = "upload_directory/remote_file.txt"

    # Ensure that all required credentials and paths are set
    if not all([ftp_host, ftp_user, ftp_password, local_file_path, remote_file_path]):
        logging.error("Missing required FTP credentials or file paths.")
    else:
        upload_file_ftp(ftp_host, ftp_user, ftp_password, local_file_path, remote_file_path)

Explication des fonctionnalités clés

1. Utilisation des variables d’environnement pour la sécurité

Le code de production doit éviter de stocker des informations sensibles en dur, comme les identifiants FTP. Ce script charge les identifiants à partir de variables d’environnement, qui peuvent être enregistrées dans un fichier .env pour plus de sécurité.

Exemple de fichier .env :
FTP_HOST=ftp.example.com
FTP_USER=your_username
FTP_PASSWORD=your_password
2. Journalisation avec suivi des erreurs

Grâce à la bibliothèque logging, ce script capture chaque étape et toute erreur rencontrée. Si le transfert échoue, les logs enregistrés dans ftp_upload.log montreront où le problème est survenu, facilitant ainsi le dépannage.

2024-10-26 14:21:05,123 - INFO - Connected to FTP server: ftp.example.com
2024-10-26 14:21:05,456 - INFO - File '/path/to/local_file.txt' uploaded to 'upload_directory/remote_file.txt' successfully.
3. Tentatives automatiques pour plus de stabilité

Les problèmes de réseau sont inévitables, et les tentatives répétées aident à assurer la réussite des transferts. Ce script réessaie le transfert en cas d’erreur temporaire, avec un nombre de tentatives et un délai configurables.

4. Connexion FTP sécurisée avec TLS

La sécurité est primordiale, et FTP_TLS garantit le chiffrement des données pendant la connexion FTP. La méthode prot_p() active une connexion de données sécurisée pour le transfert du fichier, renforçant la sécurité des données.


Comment exécuter le script

  1. Installer les dépendances : Assurez-vous que python-dotenv est installé.bashCopier le codepip install python-dotenv
  2. Créer le fichier .env : Ajoutez vos identifiants FTP dans un fichier .env dans le même répertoire.
  3. Exécuter le script :bashCopier le codepython ftp_upload.py
Étiquettes:

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *