Rigolons un peu du "rm -rf /"...

… Jusqu’à ce que cela nous arrive 😄

On rigole beaucoup de cette fameuse ligne de commande qui, en toute innocence, supprimera récursivement tous les fichiers et dossier à partir du root…

Cette bêtise n’est pas réservée à Linux et j’ai failli expérimenter la même chose aujourd’hui en PowerShell. C’est un excellent cas pratique pour montrer comment éviter ça.

Suppression récursive en PowerShell

L’équivalent littéral en PowerShell serait le suivant :

1
PS C:\> Delete-Item -Path \ -Recurse

N’exécutez pas cette ligne. Sans le moindre avertissement, PowerShell tentera de supprimer sans prévenir, et récursivement, tous les fichiers contenus à la racine de la partition sur laquelle on a exécuté la commande.

S’en prémunir

PowerShell possède deux mécanismes de protection pour cette commande, mais également pour beaucoup d’autres. Ce sont des paramètres à ajouter après l’appel du cmdlet que l’on utilise :

  • -Confirm : PowerShell demander une confirmation avant d’exécuter le cmdlet
  • -WhatIf : PowerShell simulera une exécution et décrira le résultat

Pour voir l’intégralité des paramètres ainsi que des exemples pour les différents cmdlet qui existent :

1
2
# Ex. : Get-Help Get-ChildItem
PS C:\> Get-Help <nom du cmdlet>

L’anecdote

J’aime les fonctions pour me faciliter la vie et rendre le code plus clair. Une de ces fonctions me servait à ajouter un “” à la fin d’un chemin donné en paramètre… Chemin qui était utilisé, par la suite, comme base de suppression récursive de fichiers et de dossier.

Sauf que je ne vérifiais pas que le chemin reçu pouvait être vide. Ce qui, en théorie, ne devrait pas arriver mais il ne faut jamais oublier que si ça peut arriver, ça arrivera.

Heureusement, par paranoïa, j’avais ajouté le flag -WhatIf ; sans celui-ci, j’aurais été bien embêtée à la fin de l’exécution du script…