Créer des fichiers temporaires dans bash

Existe-t-il des moyens objectivement meilleurs de créer des fichiers temporaires dans des scripts bash?

Normalement, je leur nomme tout ce qui me vient à l’esprit, tel que tempfile-123, car il sera supprimé lorsque le script sera terminé. Y a-t-il un inconvénient à faire cela en plus d’écraser un éventuel tempfile-123 dans le dossier actuel? Ou existe-t-il un avantage à créer un fichier temporaire de manière plus prudente?

La page de mktemp(1) explique assez bien:

Traditionnellement, de nombreux scripts shell prennent le nom du programme avec le pid comme suffixe et l’utilisent comme nom de fichier temporaire. Ce type de schéma de dénomination est prévisible et la condition de course qu’il crée est facile à gagner pour un attaquant. Une approche plus sûre, bien que toujours inférieure, consiste à créer un répertoire temporaire en utilisant le même schéma de dénomination. Bien que cela permette de garantir qu’un fichier temporaire ne sera pas corrompu, il permet tout de même une attaque par déni de service. Pour ces raisons, il est suggéré d’utiliser mktemp à la place.

Dans un script, j’invoque quelque chose comme mktemp

 mydir=$(mktemp -d "${TMPDIR:-/tmp/}$(basename $0).XXXXXXXXXXXX") 

qui crée un répertoire temporaire dans lequel je peux travailler et dans lequel je peux nommer en toute sécurité les fichiers réels, quelque chose de lisible et utile.

mktemp n’est pas standard, mais il existe sur de nombreuses plates-formes. Les “X” seront généralement convertis en un caractère aléatoire, et d’autres seront probablement plus aléatoires. cependant, certains systèmes (cendres d’occupation) limitent ce hasard plus que d’autres


Par ailleurs, la création sécurisée de fichiers temporaires est importante pour bien plus que le simple script de shell. C’est pourquoi Python a un fichier temporaire , Perl a un fichier :: Temp , Ruby a un fichier temporaire , etc …

Oui, utilisez mktemp .

Il créera un fichier temporaire dans un dossier conçu pour stocker des fichiers temporaires, et vous garantira un nom unique. Il affiche le nom de ce fichier:

 > mktemp /tmp/tmp.xx4mM3ePQY > 

Vous voudrez peut-être regarder mktemp

L’utilitaire mktemp prend le modèle de nom de fichier donné et en écrase une partie pour créer un nom de fichier unique. Le modèle peut être n’importe quel nom de fichier avec un certain nombre de ‘X’, par exemple /tmp/tfile.XXXXXXXXXX. Les «X» finaux sont remplacés par une combinaison du numéro de processus actuel et des lettres aléatoires.

Pour plus de détails: man mktemp

Y a-t-il un avantage à créer un fichier temporaire de manière plus prudente?

Les fichiers temporaires sont généralement créés dans le répertoire temporaire (tel que /tmp ) où tous les autres utilisateurs et processus ont un access en lecture et en écriture (tout autre script peut y créer les nouveaux fichiers). Par conséquent, le script doit faire attention à la création de fichiers tels que l’utilisation des permissions adéquates (par exemple, lecture seule pour le propriétaire, voir: help umask ) et le nom de fichier doit être difficile à deviner (idéalement aléatoire). Sinon, si les noms de fichiers ne sont pas uniques, il peut créer un conflit avec le même script exécuté plusieurs fois (par exemple , condition de course ) ou un attaquant pourrait détourner des informations sensibles (par exemple, / remplacer le fichier par sa propre version du code (comme remplacer les commandes ou les requêtes SQL en fonction de ce qui est stocké).


Vous pouvez utiliser l’approche suivante pour créer le répertoire temporaire:

 TMPDIR=".${0##*/}-$$" && mkdir -v "$TMPDIR" 

ou fichier temporaire:

 TMPFILE=".${0##*/}-$$" && touch "$TMPFILE" 

Cependant, il est toujours prévisible et n’est pas considéré comme sûr.

Selon l’ man mktemp , on peut lire:

Traditionnellement, de nombreux scripts shell prennent le nom du programme avec le pid comme suffixe et l’utilisent comme nom de fichier temporaire. Ce type de schéma de dénomination est prévisible et la condition de course qu’il crée est facile à gagner pour un attaquant.

Donc, pour être sûr, il est recommandé d’utiliser la commande mktemp pour créer un fichier temporaire unique ou un répertoire ( -d ).