web-dev-qa-db-fra.com

Création de fichiers temporaires dans bash

Existe-t-il objectivement de meilleures méthodes pour créer des fichiers temporaires dans des scripts bash?

Je les nomme normalement comme tout ce qui me passe par exemple, tel que tempfile-123, car il sera supprimé à la fin du script. Y a-t-il un inconvénient à le faire si ce n'est d’écraser un fichier temporaire temporaire dans le dossier en cours? Ou existe-t-il un avantage à créer un fichier temporaire de manière plus prudente?

137
Strapakowsky

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’utilisent comme nom de fichier temporaire. Ce type de schéma de nommage est prévisible et la condition de concurrence 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 nommage. Bien que cela permette de garantir qu'un fichier temporaire ne sera pas subverti, cela 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'appelle 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 d’utile.

mktemp n'est pas standard, mais il existe sur de nombreuses plateformes. Les "X" seront généralement convertis en une certaine forme aléatoire, et davantage seront probablement plus aléatoires; cependant, certains systèmes (busybox, par exemple) limitent ce caractère aléatoire de manière plus significative que d'autres


À propos, la création en toute sécurité de fichiers temporaires est importante pour plus que les scripts Shell. C'est pourquoi python a fichier temporaire , Perl a Fichier :: Temp , Ruby a fichier temporaire , etc…

167
kojiro

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 sort le nom de ce fichier:

> mktemp
/tmp/tmp.xx4mM3ePQY
>
37
Paulpro

Vous voudrez peut-être regarder mktemp

L'utilitaire mktemp prend le modèle de nom de fichier donné et en remplace une partie pour créer un nom de fichier unique. Le modèle peut être n’importe quel nom de fichier auquel est ajouté un certain nombre de "X", par exemple /tmp/tfile.XXXXXXXXXX. Les "X" suivants sont remplacés par une combinaison du numéro de processus actuel et de lettres aléatoires.

Pour plus de détails: man mktemp

17
John Lawrence

Y at-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 accès en lecture et en écriture (tout autre script peut y créer les nouveaux fichiers). Par conséquent, le script doit être prudent lors de la création des fichiers, par exemple en utilisant les autorisations appropriées (par exemple, en lecture seule pour le propriétaire, voir: help umask) et le nom du fichier doit être difficile à deviner (idéalement, au hasard). 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 pourrait soit pirater des informations sensibles (par exemple, lorsque les autorisations sont trop ouvertes et le nom du fichier). est facile à deviner) ou créer/remplacer le fichier par leur propre version du code (par exemple, 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 reste prévisible et n'est pas considéré comme sûr.

Selon 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 type de schéma de nommage est prévisible et la condition de concurrence qu'il crée est facile à gagner pour un attaquant.

Pour plus de sécurité, il est donc recommandé d’utiliser la commande mktemp pour créer un fichier ou un répertoire temporaire unique (-d).

11
kenorb