Pouvons-nous utiliser des dossiers temporaires comme des fichiers temporaires
TMP=$(mktemp ... )
exec 3<>$TMP
rm $TMP
cat <&3
qui sera détruit automatiquement après cette sortie du shell?
file-descriptors
tmpfs
Bob Johnson
la source
la source
Réponses:
Dans le cas d'un fichier temporaire, votre exemple dans la question le créerait, puis le dissocierait du répertoire (le faisant "disparaître"), et lorsque le script ferme le descripteur de fichier (probablement à la fin), l'espace occupé par le fichier serait récupérable par le système. Il s'agit d'une façon courante de gérer les fichiers temporaires dans des langues comme C.
Pour autant que je sache, il n'est pas possible d'ouvrir un répertoire de la même manière, du moins en aucune manière qui rendrait le répertoire utilisable.
Une façon courante de supprimer des fichiers et des répertoires temporaires à la fin d'un script est d'installer un
EXIT
piège de nettoyage . Les exemples de code donnés ci-dessous évitent d'avoir à jongler complètement avec les descripteurs de fichiers.Ou vous pouvez appeler une fonction de nettoyage:
L'
EXIT
interruption ne sera pas exécutée lors de la réception duKILL
signal (qui ne peut pas être intercepté), ce qui signifie qu'aucun nettoyage ne sera alors effectué. Il s'exécutera cependant à la fin en raison d'unINT
ou d' unTERM
signal (s'il fonctionne avecbash
ouksh
, dans d'autres shells, vous voudrez peut-être ajouter ces signaux aprèsEXIT
dans latrap
ligne de commande), ou lorsque vous quittez normalement en raison de l'arrivée à la fin du script ou de l'exécution d'unexit
appel.la source
.
et..
. (Testé sur Linux, je ne sais pas si c'est cohérent sur toutes les plateformes.)exec another-command
évidemment.Écrivez une fonction shell qui sera exécutée lorsque votre script sera terminé. Dans l'exemple ci-dessous, je l'appelle «nettoyage» et je définis un piège à exécuter sur les niveaux de sortie, comme: 0 1 2 3 6
Voir cet article pour plus d'informations.
la source
cleanup
avant une sortie propre (0) et à la réception de SIGHUP (1), SIGINT (2), SIGQUIT (3) et SIGABRT (6). il ne s'exécutera pascleanup
lorsque le script se fermera à cause de SIGTERM, SIGSEGV, SIGKILL, SIGPIPE, etc. Ceci est clairement déficient.Vous pouvez y chdir puis le supprimer, à condition de ne pas essayer d'utiliser des chemins à l'intérieur par la suite:
Je n'ai pas vérifié, mais c'est probablement le même problème lorsque vous utilisez openat (2) en C avec un répertoire qui n'existe plus dans le système de fichiers.
Si vous êtes root et sous Linux, vous pouvez jouer avec un espace de noms séparé, et
mount -t tmpfs tmpfs /dir
intérieur.Les réponses canoniques (définir un piège sur EXIT) ne fonctionnent pas si votre script est forcé dans une sortie impure (par exemple avec SIGKILL); qui peut laisser traîner des données sensibles.
Mettre à jour:
Voici un petit utilitaire qui implémente l'approche de l'espace de noms. Il doit être compilé avec
et
CAP_SYS_ADMIN
des capacités de fichier données (en tant que root) avecLors de l'exécution (en tant qu'utilisateur normal) en tant qu'utilisateur
il partagera son espace de noms de système de fichiers, montera un système de fichiers tmpfs
/proc/sysvipc
, y chdir et s'exécuteracommand
avec les arguments donnés.command
ne pas hériter desCAP_SYS_ADMIN
capacités.Ce système de fichiers ne sera pas accessible à partir d'un autre processus non démarré
command
, et il disparaîtra comme par magie (avec tous les fichiers qui ont été créés à l'intérieur) quandcommand
et ses enfants meurent, peu importe comment cela se produit. Notez que cela ne fait que partager l'espace de noms de montage - il n'y a pas de barrière dure entrecommand
et d'autres processus exécutés par le même utilisateur; ils pourraient toujours se faufiler à l'intérieur de son espace de noms viaptrace(2)
,/proc/PID/cwd
ou par d' autres moyens.Le détournement de "l'inutile"
/proc/sysvipc
est, bien sûr, idiot, mais l'alternative aurait été de spam/tmp
avec des répertoires vides qui devraient être supprimés ou compliquer grandement ce petit programme avec des fourchettes et des attentes. Alternativement,dir
peut être changé par exemple./mnt/chtmp
et le faire créer par root lors de l'installation; ne le rendez pas configurable par l'utilisateur et ne le définissez pas sur un chemin appartenant à l'utilisateur, car cela pourrait vous exposer à des pièges de lien symbolique et à d'autres trucs poilus qui ne valent pas la peine d'être consacrés.chtmp.c
la source
rm $PWD
work, shell est toujours dans ce répertoire. Mais aucun nouveau fichier ne peut être placé dans ce "dossier". Vous ne pouvez que lire / écrire avec le fichier & 3, & 4. Il s'agit donc toujours d'un "fichier temporaire" et non d'un "dossier temporaire".Avez-vous besoin d'un shell spécifique?
Si zsh est une option, veuillez lire
zshexpn(1)
:Par exemple, j'utilise ceci dans rifle (qui fait partie du gestionnaire de fichiers ranger) pour décrypter un fichier, puis exécuter rifle sur le fichier temporaire, qui est supprimé lorsque les sous-processus se terminent. (n'oubliez pas de régler
$TERMCMD
)la source