Empêcher la suppression d'un répertoire dans / tmp

10

J'utilise souvent le /tmprépertoire sur ma machine Linux pour stocker des fichiers temporaires (par exemple des PDF à partir d'un site qui veut que je le télécharge d'abord, etc.) et je crée souvent un répertoire avec mon nom d'utilisateur. Mais à chaque démarrage, il (y compris tous les fichiers) est supprimé. Maintenant, je sais que je peux le mettre /var/tmp, mais je veux que tout son contenu soit supprimé, mais que le répertoire lui-même soit conservé. Donc:

tmp
 |- me # this should stay
 |  |- foo1 # this should be deleted...
 |  |- bar1 # ...and this as well
 |- other stuff...

Est-ce qu'il y a un moyen de faire ça? Peut-être avec des autorisations ou avec une configuration spéciale?

Linux4win
la source
1
Comme solution de contournement, vous pouvez mettre du code dans les fichiers de connexion de votre shell pour "tester et mkdir" si nécessaire.
Jeff Schaller
3
/tmpest probablement un tmpfssystème de fichiers. Ces fichiers ne sont pas vraiment supprimés; ils sont simplement stockés dans la RAM et perdus lors d'un redémarrage. C'est pourquoi vous obtenez des réponses qui se résument à «le recréer au démarrage ou à la connexion»
MSalters

Réponses:

4

Une solution serait d'utiliser une @reboottâche cron:

@reboot mkdir -p "/tmp/$USER"

L'ajouter à votre crontab avec le crontab -eferait exécuter à chaque démarrage de la machine.

Ou utiliser

mkdir -p "/tmp/$USER"

dans le fichier de démarrage de votre shell.

Dans les deux cas, vous pouvez également utiliser

TMPDIR=/tmp/$USER
export TMPDIR

dans le fichier de démarrage de votre shell si vous souhaitez utiliser ce répertoire comme répertoire temporaire par défaut.

Kusalananda
la source
Cela a) créera-t-il des répertoires pour tous les utilisateurs et b) se déclenchera-t-il également à partir d'un démarrage «à froid»?
Linux4win
1
@ Linux4win Cette réponse répond aux besoins d'un seul utilisateur, car c'est ainsi que vous avez formulé la question. Peu importe comment la machine est démarrée (à chaud, à froid ou tiède), mais elle ne se déclencherait pas lors de la sortie de l'hibernation (car ce n'est pas le démarrage).
Kusalananda
Pour une raison quelconque, l'ajout @reboot mkdir -p "/tmp/$USER"à la fin de la crontab ne fait rien, tandis que l'exécution mkdir -p "/tmp/$USER"crée réellement le répertoire. /tmp
Soit
@ Linux4win Le @reboottravail cron ne crée pas de répertoire? Recevez-vous des e-mails envoyés à votre compte avec des messages d'erreur du démon cron?
Kusalananda
eh bien non ... Peut-être parce que je n'ai pas configuré mail? Ou n'est-ce pas obligatoire?
Linux4win
14

J'utilise pam-tmpdirpour cela: il crée un répertoire temporaire privé à la connexion. Pour le configurer, ajoutez

session optional pam_tmpdir.so

aux services PAM appropriés; sur un système basé sur Debian, l'installation du libpam-tmpdirpaquet offrira de le faire pour vous, ou vous pouvez ajouter la ligne à /etc/pam.d/common-session. La prochaine fois que vous vous connecterez, vous trouverez un répertoire sous /tmp/useravec votre identifiant utilisateur et TMPet TMPDIRdéfinissez de manière appropriée.

Stephen Kitt
la source
7
Pourriez-vous expliquer quels sont les services PAM appropriés et comment y ajouter la ligne? Quels fichiers doivent être modifiés?
terdon
2

Si vous n'utilisez aucun système avec systemd et qu'il utilise systemd-tmpfiles pour gérer le nettoyage, vous devez configurer le répertoire à l'aide de ce système.

Voici une documentation complète . Vous pouvez probablement réaliser ce que vous voulez en créant /etc/tmpfiles.d/something.confavec des contenus comme:

d     /tmp/your_username   0750 your_user your_group  - -
viraptor
la source
1

Comme indiqué dans les commentaires, /tmpconcerne les fichiers transitoires et ne seront pas manqués s'ils sont supprimés. Si vous êtes au milieu de quelque chose et que la machine redémarre, tout ce que vous y avez écrit disparaîtra et vous devrez recommencer, ce qui signifie que ces fichiers n'étaient peut-être pas si temporaires après tout.

J'ai conservé un répertoire temporaire dans mon répertoire personnel pendant de nombreuses années, à partir d'un gigaoctet, c'était beaucoup d'espace et j'ai constaté qu'il fallait un nettoyage périodique pour se débarrasser des fichiers qui étaient devenus vieux et cruels. La plupart du temps, ce qui me restait après ce processus était âgé de moins de quelques semaines, donc je le nettoie maintenant avec un travail cron qui s'exécute une fois par jour:

find $HOME/tmp -depth -mtime +30 -print0 | xargs -0 -r rm -rf

Tout ce que je télécharge ou crée comme semi-temporaire y va et le système nettoie tout ce que je laisse derrière moi. Tout ce qui a besoin d'une maison permanente en obtient une bien avant que le travail cron ne s'en débarrasse.

Blrfl
la source
mkdir a a/b; touch a/b/c. Attendez maintenant l'expiration de vos 30 jours. Au fur et à mesure que vous le supprimez, cil sera mis à jour b, ce qui signifie qu'il devra attendre 30 jours supplémentaires. De même avec alorsque vous supprimez b. Deuxièmement, si vous créez des fichiers bmais ne les touchez pas apendant 30 jours, le arépertoire sera touché rm -rfet effacera vos fichiers récents sous b.
roaima
find "$HOME"/tmp -mtime +30 -type f -delete; find "$HOME/tmp" -depth -mmin +60 -type d -exec rmdir {} + 2>/dev/nulltravaille pour moi
roaima