En plus des permissions de fichiers Linux qui protègent nos fichiers d’une mauvaise utilisation, la plupart des shells Linux ont un mécanisme de protection intégré pour empêcher les écrasements accidentels de fichiers. Dans cet article, nous allons discuter de l’utilisation de ces protections.

Protéger les fichiers avec noclobber

La plupart des shells POSIX, si ce n’est tous, implémentent une option noclobber. Cela signifie que l’interpréteur de commandes se plaindra si une redirection de l’interpréteur de commandes essaie d’écraser un fichier existant.

Par défaut, principalement en raison de la tradition, l’option noclobber est désactivée. Pour l’activer dans bash ou ksh, nous utiliserons la commande suivante :

set -o noclobber

En utilisant csh ou tcsh, nous définirons l’option comme suit :

set noclobber

Une fois que nous avons défini l’option noclobber, si nous essayons d’écraser un fichier, bash se plaindra :
freestar

set -o noclobber
touch temp.txt # Créer le fichier temp.txt
echo « Hello » > temp.txt # Essayer d’écraser le contenu du fichier
-bash : temp.txt : impossible d’écraser le fichier existant

En utilisant csh/tcsh, le message d’erreur est un peu plus énigmatique :

set noclobber
touch temp.txt # Créer le fichier temp.txt
echo « Hello » > temp.txt # Essaie d’écraser le contenu du fichier
temp.txt : Le fichier existe

Nous devons noter que cela ne nous protégera que des écrasements de fichiers utilisant la redirection. La suppression du fichier via rm, l’ajout au fichier via la redirection « >> », ou simplement l’écriture dans le fichier à partir d’un processus continueront à fonctionner normalement.

Remplacer les protections

Pour remplacer la protection noclobber, nous pouvons soit revenir au comportement par défaut en désactivant l’option shell, soit remplacer temporairement les protections. Pour désactiver la restriction noclobber dans bash ou ksh, nous utilisons la sémantique des options de bash :

set +o noclobber

En tcsh/csh, cela se traduit par :

unset noclobber

Pour contourner temporairement le comportement de noclobber, nos processus shell fournissent des opérateurs de redirection spéciaux : « > ! » et « >| » respectivement. Montrons notre exemple original en utilisant bash :
freestar

set -o noclobber
touch temp.txt # Créer le fichier temp.txt
echo « Hello » > temp.txt # Essaie d’écraser le contenu du fichier
-bash : temp.txt : impossible d’écraser un fichier existant
echo « Hello » >| temp.txt # Ecraser le contenu du fichier en utilisant l’opérateur override

En utilisant tcsh, nous remplacerons simplement « >| » par « > ! »:

set noclobber
touch temp.txt # Créer le fichier temp.txt
echo « Hello » > temp.txt # Essayer d’écraser le contenu du fichier
temp.txt : Le fichier existe
echo « Hello » > ! temp.txt # Ecraser le contenu du fichier en utilisant l’opérateur override

Exemple : Tronquer un fichier journal

Un exemple classique où nous pouvons avoir besoin de cette fonctionnalité est la troncature d’un fichier journal. Ainsi, les fichiers journaux ont tendance à être maintenus ouverts par le service qui enregistre les données. En tant que tels, nous sommes généralement incapables de les supprimer car le système d’exploitation garde un œil sur les poignées de fichiers ouvertes. Pour tronquer le fichier journal, nous redirigeons /dev/null vers le fichier :

/dev/null >| mon_fichier_log.log

Cette solution a en plus la propriété de ne pas mettre à jour l’heure de modification si le fichier est inchangé. Cela signifie que si nous exécutons la redirection dans crontab et que le fichier est resté vide, l’heure de modification reflétera la dernière fois que le fichier a été tronqué.

Une autre option qui peut être utilisée dans un tel cas sans utiliser la redirection en ligne de commande est truncate. L’exemple suivant aura le même effet que le précédent, en redimensionnant effectivement le fichier à 0 :

truncate -s 0 mon_fichier_log.log

La commande truncate a un bonus supplémentaire, car elle nous permet de redimensionner notre fichier à n’importe quelle taille. L’exemple suivant va redimensionner notre fichier journal à 50MB :
freestar

truncate -s 50M mon_fichier_log.log

Conclusion

Dans cet article, nous avons discuté de l’option noclobber et de ses usages. Nous avons également présenté l’utilisation de truncate comme un outil optionnel pour redimensionner les fichiers.