Création de fichiers temporaires dans bash

Sont là objectivement meilleures façons de créer des fichiers temporaires dans des scripts bash?

Normalement, je les nomme tout ce qui me vient à l'esprit, comme tempfile-123, car il sera supprimé lorsque le script sera terminé. Y a-t-il un inconvénient à faire cela autre que d'écraser un tempfile-123 possible dans le dossier actuel? Ou y a-t-il un avantage à créer un fichier temporaire d'une manière plus prudente?

119
demandé sur Zoran Pavlovic 2012-06-11 19:15:06

4 réponses

La page de manuel mktemp(1) l'explique assez bien:

Traditionnellement, de nombreux scripts shell prennent le nom du programme avec le pid comme suffixe et l'utiliser comme nom de fichier temporaire. Ce genre le schéma de nommage est prévisible et la condition de concurrence qu'il crée est facile pour un attaquant de gagner. Une approche plus sûre, mais toujours inférieure est de créer un répertoire temporaire en utilisant le même schéma de nommage. Alors cela permet de garantir qu'un fichier temporaire ne sera pas subverti, il permet toujours une simple attaque par déni de service. Pour pour ces raisons, il est suggéré que mktemp soit utilisé à la place.

Dans un script, j'invoque mktemp quelque chose comme

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 peu de hasard, et plus sera probablement plus aléatoire; cependant, certains systèmes (busybox ash, pour un) limitent ce caractère aléatoire plus significativement que d'autres


En passant, la création sécurisée de fichiers temporaires est importante pour plus que des scripts shell. C'est pourquoi python a tempfile, perl a File::Temp, ruby a Tempfile, etc...

148
répondu kojiro 2017-09-08 17:16:39

Oui, utilisez mktemp .

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

> mktemp
/tmp/tmp.xx4mM3ePQY
>
27
répondu Paulpro 2012-06-11 15:18:10

Vous pouvez regarder mktemp

L'utilitaire mktemp prend le modèle de nom de fichier donné et écrase un partie pour créer un nom de fichier unique. Le modèle peut être tout nom de fichier avec un certain nombre de 'Xs' ajoutés, par exemple / tmp / tfile.XXXXXXXXXX. Les 'Xs' de fin sont remplacés par une combinaison du numéro de processus courant et des lettres aléatoires.

Pour plus de détails: homme mktemp

17
répondu John Lawrence 2012-06-11 15:25:24

Y a-t-il un avantage à créer un fichier temporaire d'une manière plus prudente

Les fichiers temporaires sont généralement créés dans le répertoire temporaire (comme /tmp) où tous les autres utilisateurs et les processus de lecture et d'écriture (tout autre script peut créer les nouveaux fichiers). Par conséquent, le script doit faire attention à la création des fichiers tels que l'utilisation avec les bonnes autorisations (par exemple en lecture seule pour le propriétaire, voir: help umask) et le nom de fichier ne doit pas être facilement deviné (idéalement aléatoire). Sinon, si les noms de fichiers ne sont pas uniques, cela peut créer un conflit avec le même script exécuté plusieurs fois (par exemple condition de concurrence) ou un attaquant peut soit détourner des informations sensibles (par exemple lorsque les autorisations sont trop ouvertes et que le nom de fichier est facile à deviner) ou créer/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 non considéré comme sûr.

Par man mktemp, nous pouvons 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 genre de schéma de nommage est prévisible et la condition de course qu'il crée est facile pour un attaquant de gagner.

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

10
répondu kenorb 2017-11-07 13:17:10