Bonjour à tous,
Toujours en lien avec les rencontre d’installation (“install party”), voici deux scripts que j’ai coréalisé avec une machine qui génère du texte ;)
Le fruit de ce travail repose sur deux commandes que j’avais sous le coude et un long échange textuel avec la machine, un sens critique de ma part, et une incroyable base de textes de sa part.
Voici me commande de départ :
dd if=linuxmint-18-mate-64bit.iso of=/dev/sdX oflag=direct bs=$[2**20]
et
head --bytes=$(stat -c "%s" linuxmint-18-mate-64bit.iso) /dev/sdX | sha256sum
Archaïque, rudimentaire mais qui déjà faisaient le travail (“job”).
Ci-joint les deux scripts,
Attention que je crain ici que le logiciel de courriel insère des retour à la ligne supplémentaire, veuillez plutôt utiliser les pièces jointes.
iso-to-usb.sh
=============
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
print_help() { echo "\
Copie une image ISO brute sur une clé USB avec dd, en sécurisant et affichant une progression optionnelle.
Usage : $0 [-p] [-b blocksize] [-v] fichier.iso /dev/sdX
Options :
-p Affiche la progression (status=progress)
-b blocksize Taille du bloc pour dd (ex: 1M, 4M). Par défaut : 1M
-v Mode verbeux : affiche la commande dd avant exécution
-h Affiche cette aide
Exemples :
$0 linuxmint.iso /dev/sdc
$0 -p -b 4M -v debian.iso /dev/sdb
"; }
trap 'echo -e "\n⏹️ Interruption détectée, arrêt du script." >&2; exit 130' INT
# Vérification d'être root
if (( EUID != 0 )); then
echo "Erreur : ce script doit être lancé avec les droits root (sudo)." >&2
exit 8
fi
PROGRESS=0
VERBOSE=0
BLOCKSIZE="1M"
while getopts ":pb:vh" OPT; do
case "$OPT" in
p) PROGRESS=1 ;;
b) BLOCKSIZE="$OPTARG" ;;
v) VERBOSE=1 ;;
h) print_help; exit 0 ;;
\?) echo "Option invalide : -$OPTARG" >&2; exit 1 ;;
:) echo "Option -$OPTARG nécessite un argument." >&2; exit 1 ;;
esac
done
shift $((OPTIND -1))
[ "$#" -ne 2 ] && { print_help; exit 1; }
ISO="$1"
DEVICE="$2"
# Forcer majuscule pour blocksize
BLOCKSIZE="${BLOCKSIZE^^}"
readonly ISO DEVICE PROGRESS VERBOSE BLOCKSIZE
# Validation du blocksize (ex: nombre suivi optionnellement de K, M, G, insensible à la casse)
if ! [[ "${BLOCKSIZE^^}" =~ ^[0-9]+[KMG]?$ ]]; then
echo "Erreur : blocksize '$BLOCKSIZE' invalide. Exemple valide : 1M, 512K, 4G." >&2
exit 9
fi
# Vérifications
[ ! -f "$ISO" ] && { echo "Erreur : le fichier ISO '$ISO' n'existe pas."; exit 2; }
[ ! -b "$DEVICE" ] && { echo "Erreur : le périphérique '$DEVICE' n'existe pas ou n'est pas un périphérique bloc."; exit 3; }
if ! [ -w "$DEVICE" ]; then
echo "Erreur : pas les droits en écriture sur '$DEVICE'."; exit 4
fi
# Vérifier si une partition du device est montée
if lsblk -nr -o NAME,MOUNTPOINT | grep -E "^$(basename "$DEVICE")" | awk '$2!=""' | grep -q .; then
echo "Erreur : une ou plusieurs partitions du périphérique '$DEVICE' sont montées. Veuillez démonter avant." >&2
exit 5
fi
# Confirmation utilisateur
read -rp "⚠️ Attention, toutes les données sur $DEVICE seront détruites. Continuer ? (o/N) " CONFIRM
if [[ ! $CONFIRM =~ ^[Oo]$ ]]; then echo "Abandon."; exit 0; fi
echo "📝 Copie de '$ISO' vers '$DEVICE' avec dd (blocksize=$BLOCKSIZE)..."
DD_CMD=(dd if="$ISO" of="$DEVICE" bs="$BLOCKSIZE" oflag=direct conv=fdatasync)
[ "$PROGRESS" -eq 1 ] && DD_CMD+=(status=progress)
if [ "$VERBOSE" -eq 1 ]; then
echo "Commande dd : ${DD_CMD[*]}"
fi
# Exécution
"${DD_CMD[@]}"
echo "💾 Synchronisation des écritures sur le périphérique..."
sync
echo "✅ Copie terminée."
exit 0
iso-usb-check.sh
================
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
print_help() { echo "\
Vérifie qu'une image ISO a été correctement copiée sur une clé USB en comparant une empreinte (hash).
Usage : $0 [-a algo] [-p] [-t] fichier.iso /dev/sdX
Options :
-a ALGO Algorithme de hachage (md5, sha1, sha256, sha512, etc.).
Par défaut : md5
-p Affiche une barre de progression durant la lecture (utilise pv)
-t Calcule les deux empreintes en parallèle
-h Affiche cette aide
Exemples :
$0 linuxmint.iso /dev/sdc
$0 -a sha256 -pt debian.iso /dev/sdb
"; }
# Valeurs par défaut
ALGO="md5"; PROGRESS=0; PARALLEL=0
# Traitement des options
while getopts ":a:pth" OPT; do
case "$OPT" in
a) ALGO="$OPTARG" ;;
p) PROGRESS=1 ;;
t) PARALLEL=1 ;;
h) print_help; exit 0 ;;
\?) echo "Option invalide : -$OPTARG" >&2; exit 1 ;;
:) echo "Option -$OPTARG nécessite un argument." >&2; exit 1 ;;
esac
done
shift $((OPTIND -1))
[ "$#" -ne 2 ] && { print_help; exit 1; }
ISO="$1"; DEVICE="$2"; HASH_CMD="${ALGO}sum"
readonly ISO DEVICE ALGO HASH_CMD PROGRESS PARALLEL
# Vérifications
[ ! -f "$ISO" ] && { echo "Erreur : le fichier ISO '$ISO' n'existe pas."; exit 2; }
[ ! -b "$DEVICE" ] && { echo "Erreur : le périphérique '$DEVICE' n'existe pas ou n'est pas un périphérique bloc."; exit 3; }
command -v "$HASH_CMD" >/dev/null || { echo "Erreur : la commande '$HASH_CMD' n'est pas disponible."; exit 4; }
[ "$PROGRESS" -eq 1 ] && ! command -v pv >/dev/null && { echo "Erreur : 'pv' n'est pas installé."; exit 7; }
lsblk -n -o MOUNTPOINT "$DEVICE" | grep -q '/' && { echo "Erreur : un volume du périphérique '$DEVICE' est monté. Veuillez démonter avant."; exit 5; }
echo "🔍 Vérification avec l’algorithme : $ALGO"
ISO_SIZE=$(stat -c "%s" "$ISO")
ISO_TMP=$(mktemp); USB_TMP=$(mktemp)
trap 'rm -f "$ISO_TMP" "$USB_TMP"' EXIT
# Calculs
if [ "$PARALLEL" -eq 1 ]; then
"$HASH_CMD" "$ISO" | awk '{print $1}' > "$ISO_TMP" &
if [ "$PROGRESS" -eq 1 ]; then
head --bytes="$ISO_SIZE" "$DEVICE" | pv -s "$ISO_SIZE" | "$HASH_CMD" | awk '{print $1}' > "$USB_TMP" &
else
head --bytes="$ISO_SIZE" "$DEVICE" | "$HASH_CMD" | awk '{print $1}' > "$USB_TMP" &
fi
wait
else
"$HASH_CMD" "$ISO" | awk '{print $1}' > "$ISO_TMP"
if [ "$PROGRESS" -eq 1 ]; then
head --bytes="$ISO_SIZE" "$DEVICE" | pv -s "$ISO_SIZE" | "$HASH_CMD" | awk '{print $1}' > "$USB_TMP"
else
head --bytes="$ISO_SIZE" "$DEVICE" | "$HASH_CMD" | awk '{print $1}' > "$USB_TMP"
fi
fi
# Résultat
ISO_HASH=$(<"$ISO_TMP")
USB_HASH=$(<"$USB_TMP")
printf "%-35s %s\n" "Empreinte du fichier ISO :" "$ISO_HASH"
printf "%-35s %s\n" "Empreinte des données sur $DEVICE :" "$USB_HASH"
if diff <(echo "$ISO_HASH") <(echo "$USB_HASH") >/dev/null; then
echo "✅ Succès : image copiée correctement."
exit 0
else
echo "❌ Échec : empreintes différentes."
exit 6
fi
Qu’en dites-vous ?
Bien à vous,
Serge