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 :
- Stockage des identifiants dans les variables d’environnement : Évitez de coder en dur les informations sensibles.
- Journalisation : Enregistrez chaque étape du transfert, de la connexion à l’achèvement, dans des fichiers de log.
- Tentatives automatiques : Gérez les problèmes de réseau avec des tentatives répétées.
- 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
- Installer les dépendances : Assurez-vous que
python-dotenv
est installé.bashCopier le codepip install python-dotenv
- Créer le fichier
.env
: Ajoutez vos identifiants FTP dans un fichier.env
dans le même répertoire. - Exécuter le script :bashCopier le code
python ftp_upload.py