rm Confirmation Guard
rm ne demande pas deux fois. Pas de corbeille, pas de « êtes-vous sûr », surtout pas avec sudo devant, où un espace de trop ou la mauvaise variable peut effacer quelque chose que vous n'avez pas la permission de revérifier. C'est la seule habitude vraiment destructrice qu'un terminal vous inculque, et le correctif ne demande aucun outil supplémentaire, juste quelques lignes dans .bashrc.
L'idée est de masquer la commande sudo par une fonction Bash du même nom. Tous les autres usages de sudo passent toujours directement, mais dès que le premier argument est rm, elle s'arrête et pose la question.
# rm confirmation
sudo() {
if [ "$1" = "rm" ]; then
echo -n "Are you sure you want to delete files/folders with sudo? (y/n) "
read ans
if [[ $ans == [Yy]* ]]; then
command sudo rm "${@:2}"
else
echo "Deletion cancelled."
fi
else
command sudo "$@"
fi
}
Comment ça marche
sudo() { ... }définit une fonction nomméesudo. Bash cherche les fonctions avant de chercher les commandes duPATH, donc tapersudodans un terminal lance désormais celle-ci au lieu de/usr/bin/sudo, sans aucune bidouille d'alias.if [ "$1" = "rm" ]ne regarde que le tout premier mot aprèssudo.sudo rm -rf /srv/docker/vieille-stackcorrespond,sudo apt updatenon.- En cas de correspondance, elle affiche la question, lit la réponse dans
$ans, et[[ $ans == [Yy]* ]]acceptey,Y,yes, tout ce qui commence par un Y dans l'une ou l'autre casse. command sudo rm "${@:2}"est la partie qui supprime réellement.commandcontourne la fonction pour qu'elle ne s'appelle pas elle-même, et${@:2}représente tous les arguments aprèsrm, donc-rf /srv/docker/vieille-stackest transmis tel quel.- Tout ce qui n'est pas
rmtombe dans leelseet s'exécute exactement comme si la fonction n'existait pas :command sudo "$@".
L'installer
Ouvrir la config de votre shell
nano ~/.bashrc
Coller la fonction
Ajoutez le bloc ci-dessus à la fin du fichier, puis enregistrez et quittez.
Recharger
source ~/.bashrc
Essayer
$ sudo rm -rf /tmp/test
Are you sure you want to delete files/folders with sudo? (y/n) n
Deletion cancelled.
Répondez y et elle s'exécute pour de vrai. Tout ce qui n'est pas rm, sudo apt update, sudo systemctl restart docker, passe sans question.
Terminé !
~/.bashrc, donc ne s'applique qu'à votre shell interactif, pas aux scripts, aux tâches cron ni à la session d'un autre utilisateur. C'est bien le but : attraper vous, en train de taper, pas un programme qui appelle sudo rm volontairement.Ce que ça n'attrapera pas
C'est un garde-fou, pas un bac à sable. Il ne se déclenche que lorsque rm est littéralement le premier mot après sudo, donc tout ce qui atteint rm d'une autre façon passe à côté :
sudo -i rm -rf /ousudo su -c "rm -rf /", le premier argument est-iousu, pasrmsudo bash -c "rm -rf /srv/docker", même raison,rmest enfoui dans la chaîne que bash exécutesudo find /srv/docker -delete, qui supprime tout aussi définitivement, et n'appelle jamaisrmrmsanssudosur des fichiers qui vous appartiennent déjà
La vraie protection contre cette dernière catégorie, c'est une sauvegarde en bonne et due forme, Backrest et le script d'arrêt Docker traité ailleurs dans cette section, ou autre chose. Cette fonction vaut quand même le coup : les accidents qu'elle attrape sont ceux qui arrivent réellement, un sudo rm -rf tapé trop vite avec une faute dans le chemin, pas une tentative délibérée de la contourner.
Backrest Docker Stop
Un script bash qui arrête les conteneurs Docker avant une sauvegarde Backrest et les redémarre après, pour des sauvegardes de bases de données sans dump complexe.
Poubelle
Des tutoriels obsolètes gardés pour référence, et des applications alternatives remplacées ailleurs sur le site mais qui fonctionnent toujours très bien.