Mémo de la fiche B2-30 : une page A4, à imprimer ou à enregistrer en PDF.
B2-30

Automatiser l'administration : Bash et PowerShell

Écrire des scripts Bash et PowerShell fiables pour les tâches répétitives (sauvegardes, comptes, contrôles), les planifier et les rendre sûrs.

Version en ligne
SIO2 · semestre 35 h (cours + TP)Bloc 2 – SISRMémo · Portail SIO
SCRIPTSBash · PowerShell Pourquoirépétitif · fastidieux · risquétemps · fiabilité · traces Bash#!/bin/bash · "$VAR" · $1if [ ] · for · fonctions Décider0 = succès · $? · exit Nset -euo pipefail PowerShellparam() · Import-Csvtry/catch · -WhatIf Planifiercron : m h j m jstimer systemd · tâche Windows Fiabiliseridempotent · testé · versionnépas de secret en clair

L'essentiel

  1. On automatise ce qui est répétitif, fastidieux ou risqué : gain de temps, fiabilité, régularité, traçabilité.
  2. Script Bash : #!/bin/bash, commentaires, chmod u+x, test de syntaxe avec bash -n.
  3. Variables : NOM="valeur" sans espace, lues avec "$NOM" entre guillemets ; $(commande) pour récupérer un résultat.
  4. Paramètres : $1, $2, $#, "$@" ; valeur par défaut ${2:-7}.
  5. Code de retour 0 = succès ; $?, if [ … ], &&, ||, exit N ; set -euo pipefail.
  6. Boucles for et while read ; fonctions ; journal avec >> et logger.
  7. cron : minute heure jour mois jour-semaine commande ; timers systemd avec OnCalendar et Persistent=true.
  8. PowerShell : param(), foreach sur des objets, Import-Csv -Delimiter ';', try/catch, -WhatIf, Start-Transcript.
  9. Stratégie d'exécution RemoteSigned ; planification avec Register-ScheduledTask.
  10. Script de production : idempotent, testé, journalisé, versionné, sans secret en clair, exécuté avec le moindre privilège.

Piège classique

Les crochets sont des commandes : il faut un espace après [ et avant ]. if [-d $D] provoque « command not found ». Et sans guillemets, une variable vide ou contenant un espace casse le test : écris toujours "$D".

Le mode strict

En tête de script, set -euo pipefail arrête le script à la première erreur (-e), sur une variable non définie (-u) et si une commande d'un enchaînement | échoue (pipefail). Un script de production démarre presque toujours ainsi.

Piège classique

Un tableur français enregistre les CSV avec un point-virgule et souvent un encodage Windows : précise -Delimiter ';' et vérifie les accents (enregistre en « CSV UTF-8 »). Sinon, Import-Csv voit une seule colonne nommée « Prenom;Nom;Service » et toutes les propriétés sont vides.

Déboguer pas à pas

En Bash, bash -x script.sh affiche chaque ligne avant de l'exécuter, avec les variables remplacées par leur valeur ; bash -n vérifie la syntaxe sans rien exécuter. En PowerShell, Set-PSDebug -Trace 1 fait la même chose, et -WhatIf simule les modifications.

Commandes clés

Pour…Commandes
Préparer un script Bash#!/bin/bash · set -euo pipefail · chmod 750 script.sh · bash -n / bash -x
Tester et déciderif [ -d "$D" ]; then … fi · cmd || exit 1 · $?
Répéterfor D in a b c; do … done · while read -r L; do … done < fichier
Planifier (Linux)crontab -e · 30 2 * * 1-5 /chemin/script.sh >> journal 2>&1 · systemctl list-timers
PowerShellparam([Parameter(Mandatory)][string]$F) · Import-Csv -Delimiter ';' · try { } catch { }
Exécuter et planifier (Windows)Set-ExecutionPolicy RemoteSigned · -WhatIf · Register-ScheduledTask