Script bash "MONTER"
#!/bin/bash #----------------------------------------------------------------------- # # Site 'ERMAIA - 10 août 2011 - Copie libre (sous licence GNU) # # MONTER des partitions # #----------------------------------------------------------------------- # # rm /tmp/brouillon.txt 2> /dev/nul rm /tmp/intermediaire.txt 2> /dev/nul rm /tmp/final.txt 2> /dev/nul rm /tmp/finalTypeA.txt 2> /dev/nul rm /tmp/finalTypeB.txt 2> /dev/nul rm /tmp/finalTypeC.txt 2> /dev/nul rm /tmp/finalTypeD.txt 2> /dev/nul rm /tmp/finalTypeE.txt 2> /dev/nul rm /tmp/finalType.txt 2> /dev/nul rm /tmp/Partition.txt 2> /dev/nul rm /tmp/PartitionType-2.txt 2> /dev/nul # VERT="\\033[1;32m" NORMAL="\\033[0;39m" ROUGE="\\033[1;31m" ROSE="\\033[1;35m" BLEU="\\033[1;34m" BLANC="\\033[0;02m" BLANCLAIR="\\033[1;08m" JAUNE="\\033[1;33m" CYAN="\\033[1;36m" # # Dépendances : # Nécessite le script complémentaire suivant : if ! [ `which montreFST.sh 2> /dev/nul` ] then echo; echo " Le script 'montreFST.sh' n'existe pas." ; echo "J'ai cherché dans : "$PATH ; echo ; echo " --> Installer le script "; echo echo -e "$ROUGE" "Erreur fatale" "$NORMAL" exit 1 fi # Nécessite 'FSARCHIVER' if ! [ `which fsarchiver 2> /dev/nul` ] then echo; echo " Le fichier 'FSARCHIVER' n'existe pas." ; echo "J'ai cherché dans : "$PATH ; echo ; echo " --> Installer le paquet "; echo echo -e "$ROUGE" "Erreur fatale" "$NORMAL" exit 1 fi # Nécessite 'DIALOG' if ! [ `which dialog 2> /dev/nul` ] then echo; echo " Le fichier 'DIALOG' n'existe pas." ; echo "J'ai cherché dans : "$PATH ; echo ; echo " --> Installer le paquet "; echo echo -e "$ROUGE" "Erreur fatale" "$NORMAL" exit 1 fi # Usage if [[ $1 == "--help" ]] then echo -e "$VERT" cat <
3.00) est capable de monter les partitions qui sont au format UFS (lecture seule). Options : --help = Cette aide succincte ; -r --read-only = Monter en "lecture seule" ; à noter que les partitions 'UFS' ne peuvent pas être montées avec des droits d'écriture. -d --detail = Détailler les caractéristiques des disques durs et des partitions qui peuvent être montées. -c --chroot = Chrooter sur la partition (le script MONTER appelle CHROOTER) ; à noter que le script CHROOTER peut être appelé seul, dès lors que la partition à travailler est déjà montée sur '/mnt'. EOF echo -e "$NORMAL" exit 0 fi # Pour travailler dans une session graphique nécessite soit : 'XFCE4-TERMINAL', soit 'GNOME-TERMINAL' tty | grep -q "/dev/pts/" if [ $? -eq 0 ] then Xterminal="" if ! [ `which gnome-terminal 2> /dev/nul` ] then echo "Le terminal 'GNOME-TERMINAL' n'est pas installé" else Xterminal="GNOME-TERMINAL" #echo "X-TERMINAL = "$Xterminal fi if ! [ `which xfce4-terminal 2> /dev/nul` ] then echo "Le terminal 'XFCE4-TERMINAL' n'est pas installé" else Xterminal="XFCE4-TERMINAL" #echo " ---> X-TERMINAL = "$Xterminal fi if [[ $Xterminal == "" ]] then echo ; echo -e "$VERT""___""$NORMAL""Dans une session graphique, les scripts MONTER et CHROOTER necessitent un X-TERMINAL (mais ils sont fonctionnels dans une session sans X.) " echo ; echo -e "$VERT""___""$NORMAL""Aucun X-TERMINAL trouvé : Prière de télécharger et d'installer l'un des paquets suivants :" echo ; echo " 'GNOME-TERMINAL' 'XFCE4-TERMINAL' "; echo echo -e "$ROUGE" "Erreur fatale" "$NORMAL" exit 1 fi fi # # Récupérer un paramètre de ligne de commande Ecriture="" AppelChroot="" Detailler="" while [ "$#" -gt 0 ]; do case $1 in --read-only) Ecriture="-r" ;; -r) Ecriture="-r" ;; --chroot) AppelChroot="--chroot" ;; -c) AppelChroot="--chroot" ;; --detail) Detailler="--detail" ;; -d) Detailler="--detail" ;; -rd) Ecriture="-r" ; Detailler="--detail" ;; -dr) Ecriture="-r" ; Detailler="--detail" ;; -dc) AppelChroot="--chroot" ; Detailler="--detail" ;; -cd) AppelChroot="--chroot" ; Detailler="--detail" ;; *) Inconnu=$1 echo -e "$VERT" " Paramètre ""$ROUGE"$Inconnu"$VERT"" inconnu ==> -r --read-only -c --chroot -d --detail -dr -rd -cd -dc --help : Je sors" "$NORMAL" exit 1 ;; esac shift done echo echo "Ecriture= "$Ecriture echo "AppelChroot= "$AppelChroot echo "Detailler= "$Detailler echo if [[ $Ecriture == -r ]] && [[ $AppelChroot == --chroot ]] then echo echo -e "$VERT" "Les arguments ""$ROUGE""'--chroot' et '--read-only'""$VERT"" sont incompatibles : Je sors. " "$NORMAL" echo exit 1 fi # # #" substr($5,2,3) # Récupérer la liste des partitions existantes avec 'fsarchiver' (sauf la partition 'SWAP') fsarchiver probe 2> /tmp/intermediaire.txt # awk 'substr($1,5,1) <= 9 && substr($1,5,1) >= 1 && substr($3,2,4) != "swap" \ {print substr($1,2,5) " " substr($3,2,8) "________" substr($5,2,10) " off "}' /tmp/intermediaire.txt > /tmp/final.txt Resultat=`cat /tmp/final.txt` # # Voir les partitions existantes et celles qui sont montées (deux cas de figure : soit console graphique [tty --> pts], # soit console texte [tty --> tty], on filtre en conséquence. if [[ "$Detailler" == "--detail" ]] then tty | grep -q "/dev/pts/" if [ $? -eq 0 ] then case $Xterminal in GNOME-TERMINAL ) gnome-terminal --hide-menubar --geometry=90x30 -- /usr/bin/montreFST.sh --graph & ;; XFCE4-TERMINAL ) xfce4-terminal --hide-toolbar --hide-menubar --geometry=90x30 --execute /usr/bin/montreFST.sh --graph & ;; esac fi # tty | grep -q "/dev/tty" if [ $? -eq 0 ] then /usr/bin/montreFST.sh fi fi # # Boîte de menu 'Dialog' pour choisir les partitions à monter # touch /tmp/dialoghdatmp && FICHTMP=/tmp/dialoghdatmp trap "rm -f $FICHTMP" 0 1 2 3 15 # dialog \ --backtitle "Bon, je monte quoi ?" --title "Menu " \ --ok-label "Valider" --cancel-label "Quitter" \ --checklist "Cochez une ou plusieurs partitions (montage sur /mnt)" 16 62 7 \ $Resultat 2> $FICHTMP if [ $? != 0 ]; then echo $? clear exit $? fi # clear # Formatage de la réponse : Enlever les guillemets encadrant les résultats de la boîte 'DIALOG' Rien="" Guillemet='"' sed "s/$Guillemet/$Rien/g" < $FICHTMP > /tmp/brouillon.txt # # Tester si un choix a été fait dans 'DIALOG' if test ! -s /tmp/brouillon.txt then echo; echo -e "$JAUNE" "___ Aucune partition à monter n'a été choisie : Je sors. ___" "$NORMAL"; echo exit 0 fi # # Combiner le fichier 'Liste des partitions choisies' et le fichier 'Type' ListePart=`cat /tmp/brouillon.txt` for index in $ListePart do grep -w $index /tmp/final.txt >> /tmp/finalTypeA.txt done # # Formatage du fichier : Enlever les "________" Espace=" " Tiret="________" sed "s/$Tiret/$Espace/g" < /tmp/finalTypeA.txt > /tmp/finalTypeB.txt # # Formatage du fichier : Remplacer "ntfs" par "ntfs-3g" pour monter un fichier ntfs en lecture/écriture sed "s/ntfs/ntfs-3g/g" < /tmp/finalTypeB.txt > /tmp/finalTypeC.txt # # Formatage du fichier : Remplacer le séparateur des champs " " (Espace) par le séparateur "," (une seule virgule). Espace=" " Virgule="," sed "s/$Espace/$Virgule/g" < /tmp/finalTypeC.txt > /tmp/finalTypeD.txt Virgules_5=",,,,," sed "s/$Virgules_5/$Virgule/g" < /tmp/finalTypeD.txt > /tmp/finalTypeE.txt # # Formatage du fichier : Remplacer "ufs" par "ufs -o ufstype=ufs2" pour monter un fichier ufs en lecture ; il s'ensuit la création de deux champs supplémentaires : $3 et $4. sed "s/ufs/ufs -o ufstype=ufs2/g" < /tmp/finalTypeE.txt > /tmp/finalType.txt # # S'assurer que le répertoire de montage /mnt/XXX existe ; sinon, le créer ; $1 : 1er champ : 'partition' ; $2 : 2ème champ : 'type' awk 'BEGIN { FS="," } {print("Partition="$1"; \ if test ! -d /mnt/$Partition; \ then mkdir -v /mnt/$Partition; fi; ") | "sh"}' /tmp/finalType.txt # echo -e "$JAUNE" echo echo "xxxx" echo # # Monter les répertoires ; $1 : 1er champ : 'partition' ; $2 : 2ème champ : 'type' # cat /tmp/finalType.txt | awk 'BEGIN { FS="," } {print $1, $2 }' > /tmp/PartitionType.txt NbrLignes=`cat /tmp/PartitionType.txt | wc -l` echo "Nombre de partitions à monter = "$NbrLignes echo # # On pipe la ligne de commande générée par AWK à MOUNT : # if [[ "$Ecriture" == "-r" ]] then awk '{print(" --read-only --types", $2, $3, $4" /dev/"$1, "/mnt/"$1) | "xargs mount"} {close("xargs mount")} {print("Partition /dev/"$1" (typée "$2") montée sur /mnt/"$1)} {print $1 > "/tmp/Partition.txt"}' /tmp/PartitionType.txt Partition=`cat /tmp/Partition.txt` echo -e "$VERT"" montée(s) en lecture seule" "$JAUNE" else awk '{print(" --types", $2, $3, $4" /dev/"$1, "/mnt/"$1) | "xargs mount"} {close("xargs mount")} {print("Partition /dev/"$1" (typée "$2") montée sur /mnt/"$1)} {print $1 > "/tmp/Partition.txt"}' /tmp/PartitionType.txt Partition=`cat /tmp/Partition.txt` fi # echo echo "xxxx" echo # # Selon l'option choisie : if [[ "$AppelChroot" == "--chroot" ]] then sleep 1 read -r Partition < /tmp/Partition.txt ; echo $Partition > /tmp/Partition.txt # ---> conserver dans ce fichier une seule entrée où CHROOTER /usr/bin/chrooter fi # echo -e "$NORMAL" exit 0 # #-----------------------------FIN------------------------------------ # # Autre façon (plus claire mais besognieuse) de piper la ligne de commande générée par AWK à MOUNT : #while IFS= read -r ligne #do #if [[ "$Ecriture" == "-r" ]] #then # On pipe la ligne de commande générée par AWK à MOUNT #echo "$ligne" | awk '{print(" --read-only --types", $2, $3, $4" /dev/"$1, "/mnt/"$1) | "xargs mount"}' #echo "$ligne" | awk '{print("Partition /dev/"$1" (typée "$2") montée sur /mnt/"$1)} {print $1 > "/tmp/Partition.txt"}' #Partition=`cat /tmp/Partition.txt` #echo -e "$VERT"" montée en lecture seule" "$JAUNE" #else #echo "$ligne" | awk '{print(" --types", $2, $3, $4" /dev/"$1, "/mnt/"$1) | "xargs mount"}' #echo "$ligne" | awk '{print("Partition /dev/"$1" (typée "$2") montée sur /mnt/"$1)} {print $1 > "/tmp/Partition.txt"}' #Partition=`cat /tmp/Partition.txt` #fi #done < /tmp/PartitionType.txt
Copier
Capture d'écran - Script "MONTER"