Featured image of post mktemp : créer des fichiers et dossiers temporaires

mktemp : créer des fichiers et dossiers temporaires

Introduction

Créer un fichier ou un dossier temporaire semble anodin : touch /tmp/monfichier ou mkdir /tmp/mondossier suffiraient. Mais dans un script, ce réflexe pose deux problèmes : un nom prévisible qu’un autre processus (ou un utilisateur malveillant) peut deviner et créer avant vous, et un risque de collision si le script tourne plusieurs fois en parallèle. mktemp règle ça : il génère un nom garanti unique et crée le fichier ou dossier de façon atomique, avec des permissions restreintes par défaut.

Syntaxe de base

mktemp [OPTION]... [TEMPLATE]

Sans argument, mktemp crée un fichier vide dans /tmp et affiche son chemin :

mktemp
# /tmp/tmp.X7fK2pQljZ

Créer un fichier temporaire

fichier=$(mktemp)
echo "Fichier créé : $fichier"

Créer un dossier temporaire

L’option -d bascule en mode dossier :

dossier=$(mktemp -d)
echo "Dossier créé : $dossier"

Personnaliser le nom avec un template

Le template doit se terminer par au moins 3 X consécutifs, remplacés par des caractères aléatoires :

mktemp /tmp/monapp.XXXXXX
mktemp -d /tmp/monapp.XXXXXX

Plus il y a de X, plus le nom est difficile à deviner :

mktemp monbackup.XXXXXXXXXX

Choisir l’emplacement

Par défaut, mktemp utilise /tmp (ou $TMPDIR si elle est définie). Pour cibler un autre répertoire sans toucher au template :

mktemp -p /var/tmp
mktemp -p /var/tmp modele.XXXXXX

Équivalent avec --tmpdir :

mktemp --tmpdir=/var/tmp

Nettoyage automatique dans un script

L’intérêt de mktemp prend tout son sens combiné à trap, pour garantir que le fichier temporaire est supprimé même si le script plante ou est interrompu (Ctrl-C) :

#!/bin/bash
set -euo pipefail

tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT

curl -s https://exemple.com/data.json -o "$tmpfile"
jq '.status' "$tmpfile"

trap ... EXIT s’exécute quelle que soit la façon dont le script se termine (fin normale, erreur, signal) — c’est la garantie qu’aucun fichier temporaire ne traîne derrière vous.

Pour un dossier temporaire à nettoyer récursivement :

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT

Prévisualiser sans créer le fichier

L’option -u affiche un nom disponible sans créer le fichier. À réserver aux tests : le nom peut être pris par un autre processus entre l’affichage et l’utilisation réelle.

mktemp -u

Permissions par défaut

mktemp
ls -l /tmp/tmp.X7fK2pQljZ
# -rw------- 1 user user 0 ... /tmp/tmp.X7fK2pQljZ

Un fichier créé par mktemp est lisible et inscriptible uniquement par son propriétaire — pas besoin de chmod manuel après coup.

Commandes fréquentes

mktemp                              # fichier temporaire dans /tmp
mktemp -d                           # dossier temporaire dans /tmp
mktemp /tmp/app.XXXXXX              # fichier avec préfixe personnalisé
mktemp -d /tmp/app.XXXXXX           # dossier avec préfixe personnalisé
mktemp -p /var/tmp                  # dans un répertoire précis
mktemp -u                           # nom disponible sans créer le fichier

Conclusion

mktemp évite deux pièges classiques du scripting bash : les noms de fichiers prévisibles, source de vulnérabilités, et les fichiers temporaires oubliés qui finissent par polluer /tmp. Combiné à trap ... EXIT, il devient le réflexe à adopter dès qu’un script bash a besoin d’un espace de travail éphémère — téléchargement, traitement intermédiaire, ou stockage du résultat d’une commande avant de le consommer.