Existe-t-il des moyens objectivement meilleurs de créer des fichiers temporaires dans des scripts bash?
Normalement, je les nomme simplement 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 l'écrasement d'un éventuel fichier tempfile-123 dans le dossier actuel? Ou y a-t-il un avantage à créer un fichier temporaire de manière plus prudente?
tempfile(1)
sur les systèmes qui en ont.Réponses:
La
mktemp(1)
page de manuel l'explique assez bien:Dans un script, j'invoque mktemp quelque chose comme
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 comme étant lisibles et utiles.
mktemp
n'est pas standard, mais il existe sur de nombreuses plates-formes. Les "X" seront généralement convertis en un certain caractère aléatoire, et plus seront probablement plus aléatoires; cependant, certains systèmes (busybox ash, pour un) limitent ce caractère aléatoire plus significativement que d'autresÀ propos, la création en toute sécurité de fichiers temporaires est importante pour plus que la simple création de scripts shell. C'est pourquoi python a tempfile , perl a File :: Temp , ruby a Tempfile , etc.
la source
mktemp
soit combinée avecbasename
, comme çamktemp -dt "$(basename $0). XXXXXXXXXX"
. S'il est utilisé sans,basename
vous risquez d'obtenir une erreur comme celle-ci mktemp: modèle non valide, `/tmp/MOB-SAN-JOB1-183-ScriptBuildTask-7300464891856663368.sh.XXXXXXXXXX ', contient un séparateur de répertoire .mktemp -dt "$(basename $0).XXXXXXXXXX"
est la bonne manière.$0
, il y a beaucoup d'espaces au pays d'OS X.mktemp -dt "$(basename "$0").XXXXXX"
trap "rm -rf $mydir" EXIT
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 renvoie le nom de ce fichier:
la source
Vous voudrez peut-être regarder
mktemp
Pour plus de détails: man mktemp
la source
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 faire attention à la création des fichiers, par exemple en utilisant les bonnes autorisations (par exemple en lecture seule pour le propriétaire, voirhelp 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 pourrait soit détourner certaines 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 avec leur propre version du code (comme le remplacement des commandes ou des requêtes SQL en fonction de ce qui est stocké).Vous pouvez utiliser l'approche suivante pour créer le répertoire temporaire:
ou fichier temporaire:
Cependant, il est toujours prévisible et non considéré comme sûr.
Selon
man mktemp
, nous pouvons lire:Donc, pour être sûr, il est recommandé d'utiliser la
mktemp
commande pour créer un fichier ou un répertoire temporaire unique (-d
).la source
${0##*/}
et de$$
développer ou de créer un lien vers une documentation à ce sujet.mktemp
est probablement le plus polyvalent, surtout si vous prévoyez de travailler avec le fichier pendant un certain temps.Vous pouvez également utiliser un opérateur de substitution de processus
<()
si vous n'avez besoin que temporairement du fichier comme entrée d'une autre commande, par exemple:la source