CoursB2-30 - Automatiser l'administration : Bash et PowerShell
Cours · Fiche de cours
B2-30 - Automatiser l'administration : Bash et PowerShell
Sommaire
B2-30 Automatiser l'administration : Bash et PowerShell
🎓 SIO2 · semestre 3⏱️ 5 h (cours + TP)🎯 Bloc 2 – SISRÉ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.
🎯 Objectifs
Repérer les tâches qui méritent d'être automatisées et le gain attendu.
Écrire un script Bash : variables, paramètres, conditions, boucles, fonctions, codes de retour.
Planifier un script avec cron ou un timer systemd.
Écrire un script PowerShell avec paramètres, boucles sur des objets et gestion des erreurs.
Créer des comptes Active Directory en série à partir d'un fichier CSV.
Test express des prérequis 3 questions · 2 minutes · conseillé avant de commencer
1. Quelle commande rend le fichier sauve.sh exécutable par son propriétaire ?
chmod u+x ajoute le droit d'exécution au propriétaire (user). À revoir : B2-14 · Debian 13.
2. En PowerShell, que transmet le pipeline | d'une cmdlet à la suivante ?
PowerShell manipule des objets : Get-Service | Where-Object Status -eq 'Stopped' filtre sur une propriété, sans découper du texte. À revoir : B2-16 · PowerShell.
3. Dans Active Directory, à quoi sert une unité d'organisation (UO) ?
Une UO est un dossier de l'annuaire : on y range les comptes d'un service et on y lie des GPO. Les droits se donnent plutôt par groupes. À revoir : B2-17 · Active Directory.
Brocéliande Logistique (entreprise fictive) accueille 25 saisonniers chaque été à l'entrepôt. Jusqu'ici, un technicien crée leurs comptes un par un dans Active Directory, puis les supprime en septembre : trois heures de clics, et chaque année des fautes de frappe, des comptes oubliés ou rangés dans la mauvaise UO.
Sur SRV-LINUX, la sauvegarde du dossier des partages est lancée « quand on y pense ». Le responsable informatique te demande d'automatiser ces deux tâches : un script PowerShell qui crée les comptes à partir du fichier envoyé par les ressources humaines, et un script Bash de sauvegarde planifié chaque nuit, qui garde une trace de chaque exécution.
Le coursPourquoi automatiser, écrire et planifier des scripts Bash, écrire des scripts PowerShell pour Active Directory, puis les rendre fiables et sûrs.
1. Pourquoi automatiser ?
Un administrateur répète sans cesse les mêmes gestes : créer des comptes, sauvegarder, nettoyer, vérifier l'espace disque, appliquer des réglages sur plusieurs machines. Un script est un fichier texte qui enchaîne ces commandes. Une fois écrit et testé, il s'exécute en quelques secondes, toujours de la même façon, à n'importe quelle heure.
Script : programme écrit dans un langage interprété (Bash sous Linux, PowerShell sous Windows) qui exécute une suite de commandes d'administration, avec des variables, des conditions et des boucles. Automatiser, c'est confier à un script, souvent planifié, une tâche qu'un humain faisait à la main.
Gain
Ce que ça change
Temps
25 comptes en 2 secondes au lieu de 3 heures ; le technicien fait autre chose pendant ce temps.
Fiabilité
Les mêmes commandes, dans le même ordre : plus de faute de frappe ni d'oubli.
Régularité
Un script planifié s'exécute chaque nuit, même pendant les vacances.
Traçabilité
Le script écrit ce qu'il a fait dans un journal : on sait qui, quoi, quand.
Documentation
Le script, commenté et versionné, décrit exactement la procédure.
Pour bien comprendre : le programme du lave-linge
Un lave-linge ne demande pas à chaque minute quoi faire : il déroule un programme écrit une fois pour toutes, étape par étape. C'est un script.
Le programme contient des conditions (« si le linge est très sale, relaver ») et des boucles (« rincer trois fois ») : un script aussi.
Le départ différé, c'est la planification : on lance le programme la nuit, quand personne n'est là. Et le voyant « erreur », c'est le code de retour qui signale qu'une étape a échoué.
Une tâche mérite un script si elle est répétitive (plusieurs fois par semaine ou sur de nombreuses machines), fastidieuse (beaucoup d'étapes) ou risquée à la main (oubli fatal, comme une sauvegarde). Avant d'écrire, fais-la une fois à la main en notant chaque commande : ce sera le squelette du script.
2. Un premier script Bash
Bash est l'interpréteur de commandes de Debian. Tout ce que tu tapes dans un terminal peut être écrit dans un fichier et rejoué. Voici le script de sauvegarde de SRV-LINUX, dans sa première version.
#!/bin/bash # Sauvegarde du dossier des partages de SRV-LINUX dans /sauvegardes # Auteur : équipe informatique Brocéliande · version 1 · 2026-10-14
SOURCE="/srv/partages"
DEST="/sauvegardes"
DATE=$(date +%F) # 2026-10-14
ARCHIVE="$DEST/partages-$DATE.tar.gz"
tar -czf "$ARCHIVE" "$SOURCE"
echo "Sauvegarde créée : $ARCHIVE"
Shebang #!/bin/bashPremière ligne : indique au système quel interpréteur doit exécuter le fichier. Sans elle, le script dépend du shell de celui qui le lance.
Commentaires #Ignorés par Bash, indispensables pour l'humain : rôle du script, auteur, version, explication des lignes délicates.
Variables NOM="valeur"Pas d'espace autour du =. On lit la valeur avec $NOM, toujours entre guillemets doubles ("$NOM") pour supporter les espaces.
Substitution $(commande)Remplace la commande par son résultat : $(date +%F) donne la date du jour, $(hostname) le nom de la machine.
CommandesExactement celles que tu taperais à la main : tar, cp, rsync, systemctl…
Debian 13 rendre exécutable et lancer
$ sudo chmod 750 /usr/local/bin/sauve-partages.sh # propriétaire : tout ; groupe : lire, exécuter $ sudo /usr/local/bin/sauve-partages.sh $ sudo bash -n /usr/local/bin/sauve-partages.sh # vérifie la syntaxe sans exécuter
2.1 Les paramètres : un script réutilisable
Au lieu d'écrire le dossier à sauvegarder « en dur », on le passe en paramètre au lancement : le même script sauvegarde alors n'importe quel dossier.
Un script paramétré se réutilise : seul le lancement change.
Variable spéciale
Contenu
$0
Nom du script
$1, $2…
Premier, deuxième… paramètre
$#
Nombre de paramètres
"$@"
Tous les paramètres, chacun séparé (à utiliser dans une boucle)
$?
Code de retour de la dernière commande (0 = succès)
$$
Numéro du processus du script
3. Décider : codes de retour et conditions
Chaque commande Linux renvoie un code de retour : 0 si tout s'est bien passé, un autre nombre (1 à 255) en cas d'erreur. Un script fiable teste ces codes et réagit : il ne doit jamais annoncer « sauvegarde réussie » si tar a échoué.
Un script ne « croit » pas que tout a marché : il le vérifie à chaque étape importante.
Debian 13 conditions et tests
if [ ! -d "$SOURCE" ]; then # -d : le dossier existe-t-il ?
echo "Erreur : $SOURCE introuvable" >&2 # vers la sortie d'erreur
exit 1
fi
tar -czf "$ARCHIVE" "$SOURCE"
if [ $? -eq 0 ]; then echo "OK"; else echo "ÉCHEC"; exit 2; fi # forme courte : la suite ne s'exécute que si la commande réussit (&&) ou échoue (||)
mkdir -p "$DEST" || exit 3
Test
Vrai si…
Test
Vrai si…
[ -f "$F" ]
le fichier existe
[ "$A" = "$B" ]
les textes sont égaux
[ -d "$D" ]
le dossier existe
[ -z "$A" ]
la variable est vide
[ -x "$F" ]
le fichier est exécutable
[ "$N" -gt 80 ]
le nombre est plus grand que 80
[ "$#" -lt 1 ]
moins d'un paramètre
[ "$N" -eq 0 ]
le nombre vaut 0 (-ne : différent)
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".
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.
4. Répéter, factoriser, tracer
4.1 Les boucles
Debian 13 deux boucles utiles
# pour chaque dossier de la liste
for D in /etc /srv/partages /var/www; do
tar -czf "/sauvegardes/$(basename "$D")-$(date +%F).tar.gz" "$D"
done # pour chaque ligne d'un fichier (un identifiant par ligne)
while read -r LOGIN; do
id "$LOGIN" &>/dev/null || echo "$LOGIN n'existe pas"
done < /root/comptes.txt
4.2 Les fonctions
Une fonction regroupe des lignes que l'on appelle plusieurs fois par leur nom. Elle reçoit ses propres paramètres $1, $2… et renvoie un code avec return.
Debian 13 une fonction de journalisation
JOURNAL="/var/log/sauve-partages.log"
journaliser() {
echo "$(date '+%F %T') [$1] $2" >> "$JOURNAL" # >> ajoute à la fin du fichier
logger -t sauve-partages "[$1] $2" # copie dans syslog (fiche B2-29)
}
journaliser INFO "Début de la sauvegarde de $SOURCE"
journaliser ERREUR "tar a échoué (code $CODE)"
> fichier écrase le fichier ; >> fichier ajoute à la fin ; 2> fichier redirige les erreurs ; &>/dev/null jette tout ; | tee -a fichier affiche et écrit en même temps. Un script planifié n'a pas d'écran : sans redirection, ses messages sont perdus.
5. Planifier sous Linux : cron et timers systemd
cron lance des commandes à heure fixe. Chaque utilisateur a sa table (crontab -e) ; les tâches du système se placent dans /etc/cron.d/. Une ligne contient cinq champs de date, puis la commande.
Clique sur chaque champ de la ligne cron pour voir ce qu'il signifie.
Choisis un champ : sa signification s'affiche ici.
Cinq champs, de la plus petite unité (minute) à la plus grande (jour de la semaine), puis la commande.
Debian 13 /etc/cron.d/sauvegardetâche système, avec l'utilisateur
# m h jdm mois jds utilisateur commande
30 2 * * 1-5 root /usr/local/bin/sauve-partages.sh /srv/partages 7 >> /var/log/sauve-cron.log 2>&1
Les timers systemd sont l'alternative moderne : un fichier .service décrit quoi lancer, un fichier .timer décrit quand. Ils écrivent dans journald, et Persistent=true rattrape une exécution manquée si la machine était éteinte.
Debian 13 /etc/systemd/system/sauve.service et sauve.timer
Un script PowerShell est un fichier .ps1. On y retrouve tout ce que tu as vu avec les cmdlets (fiche B2-16), plus des paramètres, des boucles sur des objets et une vraie gestion des erreurs. C'est l'outil naturel pour administrer Windows Server et Active Directory en série.
6.1 La stratégie d'exécution
Par défaut sur Windows Server, la stratégie d'exécution vaut RemoteSigned : les scripts écrits sur la machine s'exécutent, ceux téléchargés d'Internet doivent être signés. Sur un poste Windows 11, elle vaut souvent Restricted : aucun script ne s'exécute.
Windows PowerShell en administrateur
PS> Get-ExecutionPolicy -List PS> Set-ExecutionPolicy RemoteSigned -Scope LocalMachine PS> Unblock-File .\Creer-Saisonniers.ps1 # retire la marque « téléchargé » d'un fichier de confiance
6.2 Créer des comptes à partir d'un fichier CSV
Les ressources humaines envoient la liste des saisonniers dans un fichier CSV. Import-Csv transforme chaque ligne en objet dont les colonnes deviennent des propriétés : $u.Prenom, $u.Nom. Une boucle crée ensuite un compte par objet.
Le fichier fournit les données, le script fournit la méthode : aucune saisie manuelle.
Windows Creer-Saisonniers.ps1SRV-01, contrôleur de domaine
# Crée les comptes des saisonniers à partir du fichier des RH · v1.2
param(
[Parameter(Mandatory)][string]$Fichier, # chemin du CSV, obligatoire
[string]$UO = "OU=Saisonniers,DC=broceliande,DC=lan"
)
Import-Module ActiveDirectory
Start-Transcript -Path "C:\Scripts\Journaux\saisonniers-$(Get-Date -Format yyyyMMdd).log" -Append
$motDePasse = Read-Host "Mot de passe initial" -AsSecureString # jamais écrit dans le script
foreach ($u in Import-Csv -Path $Fichier -Delimiter ';' -Encoding UTF8) {
$login = ($u.Prenom.Substring(0,1) + $u.Nom).ToLower() -replace '[^a-z0-9]', ''
if (Get-ADUser -Filter "SamAccountName -eq '$login'") { Write-Warning "$login existe déjà"; continue }
try {
New-ADUser -Name "$($u.Prenom) $($u.Nom)" -GivenName $u.Prenom -Surname $u.Nom `
-SamAccountName $login -UserPrincipalName "$login@broceliande.lan" -Department $u.Service `
-Path $UO -AccountPassword $motDePasse -ChangePasswordAtLogon $true -Enabled $false -ErrorAction Stop
Write-Output "Créé : $login"
} catch { Write-Error "Échec pour $login : $($_.Exception.Message)" }
}
Stop-Transcript
param()Déclare les paramètres du script, avec leur type, une valeur par défaut et le caractère obligatoire. On lance : .\Creer-Saisonniers.ps1 -Fichier .\saisonniers.csv.
foreachParcourt les objets un par un ; $u désigne l'objet en cours. continue passe directement au suivant.
if (Get-ADUser …)Vérifie que le compte n'existe pas déjà : relancer le script ne crée pas de doublon (idempotence, partie 7).
try / catchCapture l'erreur d'une ligne (-ErrorAction Stop) sans arrêter tout le traitement, et l'écrit dans le journal.
Start-TranscriptEnregistre tout ce qui s'affiche dans un fichier journal daté : la trace de ce qui a été fait.
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.
La plupart des cmdlets qui modifient quelque chose acceptent -WhatIf : elles affichent ce qu'elles feraient, sans le faire. Lance d'abord New-ADUser … -WhatIf sur un fichier de trois lignes, puis seulement le vrai traitement.
6.3 Planifier sous Windows
Le Planificateur de tâches joue le rôle de cron. On peut créer la tâche dans la console taskschd.msc ou en PowerShell, avec un compte de service dédié qui n'a que les droits nécessaires.
Un script mal écrit est dangereux : il répète une erreur sur cent machines en une seconde. Ces règles distinguent un script de production d'un brouillon.
Règle
En pratique
Commenter
En-tête : rôle, auteur, version, date, paramètres ; un commentaire pour chaque bloc non évident.
Journaliser
Chaque exécution laisse une trace datée : début, actions, résultat, erreurs (logger, Start-Transcript).
Vérifier
Tester l'existence des fichiers, les codes de retour, la présence des paramètres ; set -euo pipefail ; -ErrorAction Stop.
Être idempotent
Relancer le script ne doit rien casser ni dupliquer : on vérifie avant de créer (mkdir -p, Get-ADUser avant New-ADUser).
Tester
D'abord sur une VM de test ou avec -WhatIf, sur un petit échantillon, puis en production.
Protéger les secrets
Jamais de mot de passe en clair dans un script : saisie sécurisée, fichier protégé lisible par le seul compte de service, gestionnaire de secrets.
Versionner
Les scripts dans un dépôt Git : on sait qui a changé quoi, et l'on peut revenir en arrière.
Un script est idempotent si l'exécuter une fois ou dix fois donne le même résultat. « Créer le dossier s'il n'existe pas » est idempotent ; « ajouter cette ligne à la fin du fichier » ne l'est pas (la ligne serait ajoutée dix fois). C'est essentiel pour un script planifié ou relancé après une erreur.
Un script lancé par cron en root ou par une tâche en SYSTEM a tous les droits : s'il est modifiable par un autre utilisateur, c'est une porte d'entrée. Le fichier appartient à root (ou aux administrateurs), en lecture et exécution seulement pour les autres (chmod 750), et le compte qui l'exécute n'a que les droits utiles.
7.1 Bash ou PowerShell ?
Choisir le langage du script Réponds pour la tâche que tu dois automatiser
La tâche agit-elle sur Windows ou sur Active Directory ?Comptes, GPO, partages Windows, services d'un serveur Windows.
La tâche agit-elle sur un serveur Linux (fichiers, services, paquets) ?Sauvegarde, nettoyage, contrôle d'un service Debian.
Faut-il manipuler beaucoup de données structurées (CSV, JSON, API web) ?Lire une liste, interroger une API, produire un rapport.
Choisis PowerShell : ses modules (ActiveDirectory, GroupPolicy, SmbShare…) parlent directement aux objets Windows. Planifie avec le Planificateur de tâches.
Choisis Bash : il est présent sur tous les serveurs Linux et enchaîne naturellement les commandes du système. Planifie avec cron ou un timer systemd.
PowerShell (qui existe aussi sous Linux) ou Python : ils manipulent des objets et convertissent facilement CSV et JSON (Import-Csv, ConvertFrom-Json). En Bash, il faudrait découper du texte.
Prends le langage du système sur lequel la tâche s'exécute, et celui que ton équipe sait maintenir : un script que personne ne comprend devient vite un risque.
8. Dépanner un script
8.1 Pannes fréquentes
Symptôme
Cause probable
Vérification et correction
Permission denied
Droit d'exécution absent
ls -l ; chmod u+x
/bin/bash^M: bad interpreter
Fichier écrit sous Windows (fins de ligne CRLF)
sed -i 's/\r$//' script.sh ou dos2unix
Le script marche à la main mais pas dans cron
Environnement réduit (PATH minimal), chemins relatifs, pas de terminal
Chemins absolus, sortie redirigée vers un journal, tester avec env -i
Erreur avec un nom contenant un espace
Variable non protégée par des guillemets
Écrire "$VAR" partout
« L'exécution de scripts est désactivée sur ce système »
Stratégie d'exécution Restricted
Set-ExecutionPolicy RemoteSigned, ou Unblock-File
Propriétés CSV vides en PowerShell
Délimiteur ou encodage différents
-Delimiter ';', fichier en UTF-8
Doublons à chaque relance
Script non idempotent
Vérifier l'existence avant de créer
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.
8.2 Entraîne-toi : les tickets du support
Tu es de permanence au support de Brocéliande Logistique. Six tickets arrivent les uns après les autres : lis le message, observe le relevé, puis choisis la cause.
File d'attente du support6 tickets · un à la fois · l'explication s'affiche après ta réponse
Ticket n° 1De : technicien systèmePriorité haute
« J'ai écrit le script de sauvegarde sur mon poste Windows, puis je l'ai copié sur SRV-LINUX. Il refuse de démarrer. »
Debian 13 SRV-LINUX
$ ./sauve-partages.sh
-bash: ./sauve-partages.sh: /bin/bash^M: bad interpreter: No such file or directory
Quelle est la cause ?
Cause : le ^M est le retour chariot des fins de ligne Windows : le système cherche un interpréteur nommé « /bin/bash␍ ». Correction :sed -i 's/\r$//' sauve-partages.sh (ou dos2unix), et régler son éditeur sur les fins de ligne LF.
« La sauvegarde fonctionne quand Sami la lance à la main, mais il n'y a aucune archive les nuits où cron la lance. »
Debian 13 extrait du script et de la crontab
# dans le script
cd sauvegardes
tar -czf partages-$(date +%F).tar.gz /srv/partages
# crontab de root
30 2 * * * /usr/local/bin/sauve-partages.sh
Quelle est la cause la plus probable ?
Cause : à la main, Sami est dans / ; cron démarre dans le dossier personnel de root, où sauvegardes n'existe pas : cd échoue et l'archive part ailleurs ou nulle part. Et sans redirection, personne n'a vu l'erreur. Correction : chemins absolus (/sauvegardes), set -euo pipefail, sortie redirigée vers un journal.
Cause : une seule propriété nommée « Prenom;Nom;Service » : Import-Csv n'a pas découpé les colonnes. $u.Prenom est donc vide et New-ADUser échoue. Correction :Import-Csv -Delimiter ';', et vérifier l'encodage UTF-8 pour les accents.
Ticket n° 4De : technicien systèmePriorité basse
« J'ai relancé le script de configuration de SRV-LINUX après une coupure : le fichier des hôtes contient maintenant trois fois la même ligne. »
Debian 13 extrait du script
echo "172.16.50.30 srv-log" >> /etc/hosts
Quel principe ce script ne respecte-t-il pas ?
Cause :>> ajoute la ligne à chaque exécution. Correction : n'ajouter que si elle est absente : grep -q "srv-log" /etc/hosts || echo "172.16.50.30 srv-log" >> /etc/hosts.
Ticket n° 5Audit de sécuritéSécurité
« Lors de l'audit, on a trouvé ce script sur le partage commun, lisible par tous les salariés. Il est lancé chaque nuit par une tâche planifiée. »
Cause : n'importe quel salarié peut lire ce mot de passe et prendre le contrôle du domaine. Réaction : changer immédiatement le mot de passe, déplacer le script dans un dossier réservé aux administrateurs, faire tourner la tâche avec un compte de service aux droits limités (ou un gMSA), sans mot de passe dans le code.
« Mon script plante sur le dossier "Bons de livraison" de l'entrepôt alors qu'il fonctionne pour tous les autres dossiers. »
Debian 13 exécution avec bash -x
+ DOSSIER='/srv/partages/Bons de livraison'
+ tar -czf /sauvegardes/bl.tar.gz /srv/partages/Bons de livraison
tar: /srv/partages/Bons: Cannot stat: No such file or directory
Quelle est la cause ?
Cause :bash -x montre que tar reçoit trois arguments (« /srv/partages/Bons », « de », « livraison »). Correction :tar -czf "$ARCHIVE" "$DOSSIER" : toujours protéger les variables avec des guillemets doubles.
9. À l'examen et en entreprise
Une réalisation qui compte : un script commenté, paramétré et planifié (sauvegarde, création de comptes, inventaire) est une très bonne réalisation professionnelle à présenter.
Montrer son fonctionnement : lancement avec paramètres, journal produit, comportement en cas d'erreur (paramètre manquant, dossier absent), relance sans doublon.
Justifier les choix : langage, planification (cron ou timer), compte d'exécution, protection des secrets, emplacement et droits du fichier.
Documenter : en-tête du script, procédure d'utilisation, et version dans un dépôt Git.
10. L'essentiel
On automatise ce qui est répétitif, fastidieux ou risqué : gain de temps, fiabilité, régularité, traçabilité.
Script Bash : #!/bin/bash, commentaires, chmod u+x, test de syntaxe avec bash -n.
Variables : NOM="valeur" sans espace, lues avec "$NOM" entre guillemets ; $(commande) pour récupérer un résultat.
Tout cela tient sur une page : utilise le bouton Mémo à imprimer en haut de la fiche.
La pratiqueLe quiz noté pour vérifier tes acquis, les exercices à rendre à ton professeur, puis le TP au labo sur tes machines virtuelles.
11. Quiz noté
8 questions · 10 minutesRéponds à toutes les questions, puis valide. Seule ta première tentative est enregistrée : elle compte dans ton suivi. Ensuite, tu peux t'entraîner autant que tu veux.
1. À quoi sert la première ligne #!/bin/bash d'un script ?
2. Le script est lancé par ./sauve.sh /etc 30. Que contient $2 ?
3. Une commande se termine avec le code de retour 0. Qu'est-ce que cela signifie ?
4. Que signifie la ligne cron 0 22 * * 5 /usr/local/bin/rapport.sh ?
5. Pourquoi écrire "$DOSSIER" plutôt que $DOSSIER ?
6. Un fichier CSV enregistré par un tableur français sépare ses colonnes par des points-virgules. Que faut-il ajouter à Import-Csv ?
7. Que fait le paramètre -WhatIf sur New-ADUser ?
8. Un script est idempotent quand…
12. Exercices : à toi de répondre
Écris ta réponse sous chaque énoncé et envoie-la à ton professeur. Quand il l'a validée, le corrigé s'affiche à la place du cadenas ; s'il te la renvoie « à revoir », lis son commentaire et corrige.
Exercice 1 – Lire un script (SIO1)
Explique ligne par ligne ce que fait ce script, puis indique ce qu'il affiche si on le lance avec ./verif.sh sans paramètre, et avec ./verif.sh /srv/partages quand le disque est rempli à 91 %.
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
Exercice 2 – Écrire et planifier (SIO1)
Écris un script purge.sh qui supprime, dans le dossier passé en paramètre, les archives *.tar.gz de plus de N jours (N = deuxième paramètre, 14 par défaut), refuse de s'exécuter si le dossier n'existe pas, et note le nombre de fichiers supprimés dans syslog. Donne ensuite la ligne de /etc/cron.d/purge qui le lance chaque dimanche à 3 h sur /sauvegardes.
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
Exercice 3 – Dépanner (SIO1)
Un collègue a planifié sauve.sh à 2 h. Le matin, aucune archive, aucune trace. Le script contient cd backup, tar czf save.tgz $SRC et la ligne cron est * 2 * * * sauve.sh. Relève toutes les erreurs (au moins quatre) et propose la version corrigée de la ligne cron et des deux lignes du script.
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
Exercice 4 – Concevoir (SIO2)
En septembre, les comptes des saisonniers doivent être désactivés le dernier jour de leur contrat, puis supprimés trois mois plus tard. Les RH fournissent un CSV avec Login;DateFin. Décris la solution : script(s), planification, compte d'exécution, journalisation, tests et précautions pour ne jamais supprimer un compte permanent.
Le corrigé s'affichera ici dès que ton professeur aura validé ta réponse. Cherche d'abord par toi-même : c'est en se trompant qu'on retient.
13. Au labo : deux tâches automatisées
Objectif
Sur ton pool Proxmox (page Mes serveurs et VM), automatise les deux tâches de la situation professionnelle : la sauvegarde nocturne de SRV-LINUX en Bash, et la création des comptes saisonniers en PowerShell sur ton contrôleur de domaine. Compte deux heures.
Machine
Système
Rôle dans le TP
SRV-LINUX
Debian 13
Script sauve-partages.sh planifié par un timer systemd
SRV-01
Windows Server 2025, contrôleur de domaine
Script Creer-Saisonniers.ps1 et UO Saisonniers
Poste client
Windows 11 Pro
Test d'ouverture de session avec un compte créé
Ce que tu ajoutes à cette étape
Un script Bash de sauvegarde paramétré, en mode strict, qui journalise et garde 7 archives.
Sa planification chaque nuit de semaine à 2 h 30, rattrapée si la VM était éteinte.
Un script PowerShell qui crée les comptes depuis un CSV, sans doublon.
Les preuves : journaux d'exécution et tests de relance.
1 Le script de sauvegarde (SRV-LINUX)
Crée /usr/local/bin/sauve-partages.sh en assemblant ce que tu as vu : mode strict, paramètres ($1 = dossier, $2 = nombre d'archives à garder, 7 par défaut), test du dossier, archive datée dans /sauvegardes, fonction journaliser, suppression des archives en trop.
Complète les lignes clés du script, dans l'ordre. Vérifie chaque ligne avec ✓, ou tout d'un coup avec Vérifier.
ligne 1 ›
mode strict ›
dossier (1er paramètre) ›
garder (2e, 7 par défaut) ›
test du dossier ›
Debian 13 fin du script : garder les 7 archives les plus récentes
ARCHIVE="/sauvegardes/partages-$(date +%F-%H%M%S).tar.gz"
if tar -czf "$ARCHIVE" "$SOURCE" 2>/dev/null; then journaliser INFO "OK $ARCHIVE"; else journaliser ERREUR "tar a échoué"; exit 2; fi # liste par date (plus récente d'abord), saute les $GARDER premières, supprime le reste
ls -1t /sauvegardes/partages-*.tar.gz | tail -n +$((GARDER + 1)) | xargs -r rm --
2 Tester puis planifier
Teste : bash -n, puis un lancement sans paramètre (code 1 attendu : echo $?), puis sudo /usr/local/bin/sauve-partages.sh /srv/partages 3 quatre fois de suite : il ne doit rester que trois archives.
Crée sauve.service et sauve.timer (partie 5), active le timer et vérifie systemctl list-timers.
Lance le service à la main (sudo systemctl start sauve.service) et lis son journal : journalctl -u sauve.
3 Les comptes saisonniers (SRV-01)
Crée l'UO Saisonniers et le dossier C:\Scripts\Journaux (accès réservé aux administrateurs).
Prépare un fichier saisonniers.csv de cinq lignes (en-tête Prenom;Nom;Service), enregistré en CSV UTF-8, avec au moins un nom accentué et un nom composé.
Écris Creer-Saisonniers.ps1 (partie 6.2). Lance-le d'abord en ajoutant -WhatIf à New-ADUser, puis pour de vrai.
Relance-le une seconde fois : il doit signaler « existe déjà » pour les cinq comptes, sans erreur.
Active un compte, puis ouvre une session sur le poste Windows 11 : le changement de mot de passe doit être demandé.