Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#301 Le 24/04/2025, à 19:46

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Bon , j ' ai modifié les 2 elifs ( ligne 58 ) à la suite ( soit je n' ai pas compris l ' intérêt , soit y avait un truc bizzare ) :

j ' ai modifié pour :

       elif [[ -d $mp && $mp =~ $rgx ]]; then
            rmdir -v "$mp"
        else
          echo "$mp n’a pas été supprimé."
        fi

bref , là ca fait ce que ca dit , et ca dit ce que ca fait wink :

Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « toi » ? [O/n] 
umount: /media/moi (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/moi'
mkdir: création du répertoire '/media/toi'
mkdir: création du répertoire '/media/toi/iznobe-toi'
appartenance de '/media/toi/iznobe-toi' modifiée de root:root en iznobe:iznobe

-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !

Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/toi/iznobe-toi ».
iznobe@iznobe-PC:~/Scripts$ 

et 2 autres bricoles :

#!/bin/bash

# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------

LC_ALL=C

label() {
  local rgx="[^[:alnum:]_-]"

  while [ -z "$Label" ]; do
    read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
    if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]; then
      echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
      unset Label
    fi
    if lsblk -no label | grep -q "$Label"; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez en une autre."
      unset Label
    fi
  done
}

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [[ -d $pmp && $pmp =~ $rgx ]]; then
              rmdir -v "$pmp"
            else
              echo "$pmp n’a pas été supprimé."
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        elif [[ -d $mp && $mp =~ $rgx ]]; then
            rmdir -v "$mp"
        else
          echo "$mp n’a pas été supprimé."
        fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$Label/d" /etc/fstab
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
 done
}

if ((UID)); then
  echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
  exit 1
fi

declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )

i=-1

while read -ra lsblkDT; do #path fstype mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}"
      ListPart[$i,1]="${lsblkDT[1]}"
      if [[ ${lsblkDT[2]} =~ ^/ ]]; then
        ListPart[$i,2]="${lsblkDT[2]}"
        ListPart[$i,3]="${lsblkDT[3]}"
      else
        ListPart[$i,2]=""
        ListPart[$i,3]="${lsblkDT[2]}"
      fi
    fi
  fi
done < <(lsblk -no path,fstype,mountpoint,label)

if (( ${#ListPart[@]} == 0 )); then
  echo "Il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/4))

echo
echo " n° ⇒    path    label   fstype   mountpoint"
echo "-----------------------------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  if ((n+1 < 10)); then
    echo " $((n+1))  ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"  
  else
    echo " $((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  fi
done
echo

while [ -z "$PartNum" ]; do
  read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
  if [[ ! $PartNum =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
    echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"

if [ -z "$PartLabel" ]; then
  echo "La partition « $Part » n’a pas d’étiquette."
  label
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  while true; do
    read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
    case "$REPLY" in
      N|n)
        Label="$PartLabel"
        break
      ;;
      Y|y|O|o|"")
        label
        break
      ;;
      *)
      ;;
    esac
  done
fi

while true; do
  read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "

  case "$REPLY" in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        unmount        
      elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
        echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
        unmount
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        unmount
      fi

      # construction des éléments :
      if [[ $PartFstype =~ ext[2-4] ]]; then
        e2label "$Part" "$Label"
        echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
      elif [ "$PartFstype" == "ntfs" ]; then
        ntfslabel  "$Part" "$Label"
        echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
      fi
      if ! [ -d /media/"$Label" ]; then
        mkdir -v /media/"$Label"
      fi
      systemctl daemon-reload
      if ! mount -a
      then
        exit 4
      fi

      if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
        mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
      if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
      chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"

      if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        echo
        echo "-----------------------------------------------------------------"
        echo "Script pour montage de partition de données terminé avec succès !"
        echo
        echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
      else
        echo "erreur inconnue !"
        exit 5
      fi
      break
    ;;
    *)
    ;;
  esac
done

Dernière modification par iznobe (Le 24/04/2025, à 20:16)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#302 Le 24/04/2025, à 20:05

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

on peut mettre un " elif " sans d' abord avoir un " if " ???
ligne 56 a 59 .

Non, c’est une mauvaise indentation qui t’a induit en erreur.




iznobe a écrit :

Hors mis les " <  < " , qu' est ce que cella fait en français ?

Réponse flash de Qwant a écrit :

< <(command) : Cette syntaxe utilise la substitution de processus pour rediriger la sortie de command vers l'entrée standard de la boucle while. Cela signifie que la sortie de command est traitée ligne par ligne par la boucle.

 




iznobe a écrit :

un test au pif :

umount: /media/iznobe/test (/dev/nvme0n1p12) démonté
/media/iznobe/test n’a pas été supprimé.
mkdir: création du répertoire '/media/moi'
mkdir: création du répertoire '/media/moi/iznobe-moi'
appartenance de '/media/moi/iznobe-moi' modifiée de root:root en iznobe:iznobe

-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !

Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/moi/iznobe-moi ».
iznobe@iznobe-PC:~/Scripts$

c' est voulu ?

A priori, non.

Hors ligne

#303 Le 24/04/2025, à 20:14

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

En fait c' est du au second elif , mal indenté , je l' ai supprimé pour le modifier en " else " a la place .
voir les dernier modifs / script de mon dernier message .

Ça a l' air d' aller comme ça .

Dernière modification par iznobe (Le 24/04/2025, à 20:24)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#304 Le 24/04/2025, à 20:17

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

( soit je n' ai pas compris l ' intérêt , soit y avait un truc bizzare )

Je pense plutôt à un truc bizarre.




iznobe a écrit :

et 2 autres bricoles

Peux-tu préciser ?




Et, si j’ai bien compris, la version à 80 colonnes ne te sied pas. Dommage.

Hors ligne

#305 Le 24/04/2025, à 20:23

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

    et 2 autres bricoles

nany a écrit :

Peux-tu préciser ?

l ' une est l' affichage des partitions , pour etre " raccord " avec le echo final et une vue plus aérée .
l' autre c' est la fonction label , je me suis dis que plutot que d ' arreter le script , il etait preferable de demander à l' utilisateur d ' entrer un autre label :

label() {
  local rgx="[^[:alnum:]_-]"

  while [ -z "$Label" ]; do
    read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
    if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]; then
      echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
      unset Label
    elif lsblk -no label | grep -q "$Label"; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez en une autre."
      unset Label
    fi
  done
}

rien de folichon . j ' espere juste ne pas avoir fait de bourde roll


Mais je suis pas certain du truc , car cette partie me parait pas claire :

Y|y|O|o|"")
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [[ -d $pmp && $pmp =~ $rgx ]]; then
              rmdir -v "$pmp"
            else
              echo "$pmp n’a pas été supprimé."
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        elif [[ -d $mp && $mp =~ $rgx ]]; then
            rmdir -v "$mp"
        else
          echo "$mp n’a pas été supprimé."
        fi

je verrais ca plutot sans elif non ?

Y|y|O|o|"")
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
...
traitement
...
        if [[ -d $mp && $mp =~ $rgx ]]; then
            rmdir -v "$mp"
        else
          echo "$mp n’a pas été supprimé."
        fi

Dernière modification par iznobe (Le 24/04/2025, à 21:49)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#306 Le 25/04/2025, à 12:00

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour,



nany a écrit :
iznobe a écrit :

un test au pif :

umount: /media/iznobe/test (/dev/nvme0n1p12) démonté
/media/iznobe/test n’a pas été supprimé.
mkdir: création du répertoire '/media/moi'
mkdir: création du répertoire '/media/moi/iznobe-moi'
appartenance de '/media/moi/iznobe-moi' modifiée de root:root en iznobe:iznobe

-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !

Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/moi/iznobe-moi ».
iznobe@iznobe-PC:~/Scripts$

c' est voulu ?

A priori, non.

nany a écrit :
iznobe a écrit :

( soit je n' ai pas compris l ' intérêt , soit y avait un truc bizzare )

Je pense plutôt à un truc bizarre.

J’ai trouvé la « bizarrerie ».
C’est parce que tu avais testé avec une partition montée automatiquement (dans /media/$USER/<label>) et, lors du démontage, le point de montage est supprimé automatiquement.
L’erreur vient du fait qu’on teste à la fois la présence ou non du répertoire et s’il est dans /media/ ou /mnt/. Il faut en fait séparer les deux tests en imbriquant le second dans le premier :

        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [ -d "$pmp" ]; then
              if [[ $pmp =~ $rgx ]]; then
                rmdir -v "$pmp"
              else
                echo "$pmp n’a pas été supprimé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        elif [ -d "$mp" ]; then
          if [[ $mp =~ $rgx ]]; then
            rmdir -v "$mp"
          else
            echo "$mp n’a pas été supprimé."
          fi
        fi

Et on GARDE le elif.




iznobe a écrit :

l ' une est l' affichage des partitions , pour etre " raccord " avec le echo final et une vue plus aérée .

C’est purement cosmétique et la différence entre les deux echo ne saute pas tout de suite aux yeux (je ne peux pas tester le résultat car j’ai moins de dix partitions).
Petite question : que se passe-t-il si on a cent partitions ou plus ?





iznobe a écrit :

l' autre c' est la fonction label , je me suis dis que plutot que d ' arreter le script , il etait preferable de demander à l' utilisateur d ' entrer un autre label

Je ferais les tests en même temps plutôt que séparément. Donc, là aussi, un elif.



Voici donc ce que ça donnerait :

#!/bin/bash

# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------

LC_ALL=C

label() {
  local rgx="[^[:alnum:]_-]"

  while [ -z "$Label" ]; do
    read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
    if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]; then
      echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
      unset Label
    elif lsblk -no label | grep -q "$Label"; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez-en une autre."
      unset Label
    fi
  done
}

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [ -d "$pmp" ]; then
              if [[ $pmp =~ $rgx ]]; then
                rmdir -v "$pmp"
              else
                echo "$pmp n’a pas été supprimé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        elif [ -d "$mp" ]; then
          if [[ $mp =~ $rgx ]]; then
            rmdir -v "$mp"
          else
            echo "$mp n’a pas été supprimé."
          fi
        fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$Label/d" /etc/fstab
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
 done
}

if ((UID)); then
  echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
  exit 1
fi

declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )

i=-1

while read -ra lsblkDT; do #path fstype mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}"
      ListPart[$i,1]="${lsblkDT[1]}"
      if [[ ${lsblkDT[2]} =~ ^/ ]]; then
        ListPart[$i,2]="${lsblkDT[2]}"
        ListPart[$i,3]="${lsblkDT[3]}"
      else
        ListPart[$i,2]=""
        ListPart[$i,3]="${lsblkDT[2]}"
      fi
    fi
  fi
done < <(lsblk -no path,fstype,mountpoint,label)

if ((${#ListPart[@]} == 0)); then
  echo "Il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/4))

echo
echo " n° ⇒    path    label   fstype   mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  if ((n+1 < 10)); then
    echo " $((n+1))  ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  else
    echo " $((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  fi
done
echo

while [ -z "$PartNum" ]; do
  read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
  if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
    echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"

if [ -z "$PartLabel" ]; then
  echo "La partition « $Part » n’a pas d’étiquette."
  label
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  while true; do
    read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
    case "$REPLY" in
      N|n)
        Label="$PartLabel"
        break
      ;;
      Y|y|O|o|"")
        label
        break
      ;;
      *)
      ;;
    esac
  done
fi

while true; do
  read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "

  case "$REPLY" in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        unmount        
      elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
        echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
        unmount
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        unmount
      fi

      # construction des éléments :
      if [[ $PartFstype =~ ext[2-4] ]]; then
        e2label "$Part" "$Label"
        echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
      elif [ "$PartFstype" == "ntfs" ]; then
        ntfslabel  "$Part" "$Label"
        echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
      fi
      if ! [ -d /media/"$Label" ]; then
        mkdir -v /media/"$Label"
      fi
      systemctl daemon-reload
      if ! mount -a; then
        exit 3
      fi

      if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
        mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
      if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
      chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"

      if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        echo
        echo "-----------------------------------------------------------------"
        echo "Script pour montage de partition de données terminé avec succès !"
        echo
        echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Et, comme je trouve cette version un peu « brouillon » et que je préfère la version à 80 colonnes, j’insiste lourdement :

#!/bin/bash

# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet
# avertissement, vous pouvez faire ce que vous voulez de ce truc. Si on se
# rencontre un jour et que vous pensez que ce truc vaut le coup, vous pouvez
# me payer une bière en retour. iznobe
# ----------------------------------------------------------------------------

LC_ALL=C

label() {
  local rgx="[^[:alnum:]_-]"

  while [ -z "$Label" ]
  do
    echo -n "Choisissez l’étiquette (LABEL) de votre partition de données, "
    echo -n "elle doit être UNIQUE et ne pas contenir d’espace, d’accent, "
    echo -n "de caractères spéciaux et au maximum 16 caractères : "
    read -r Label
    if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]
    then
      echo -n "Le nom de votre étiquette comporte une espace, un accent ou un "
      echo "caractère spécial ou plus de 16 caractères !"
      unset Label
    elif lsblk -no label | grep -q "$Label"
    then
      echo -n "Erreur, votre étiquette « $Label » est déjà attribuée ! "
      echo "Choisissez-en une autre."
    fi
  done
}

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp=$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)

  while true
  do
    echo -n "Voulez-vous démonter la partition « $Part » de son emplacement "
    echo -n "actuel et procéder aux changements pour la monter avec "
    echo -n "l'étiquette « $Label » ? [O/n] "
    read -r
    case $REPLY in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]
        then
          for pmp in "${PartMountPoints[@]}"
          do
            umount -v "$pmp"
            if [ -d "$pmp" ]
            then
              if [[ $pmp =~ $rgx ]]
              then
                rmdir -v "$pmp"
              else
                echo "$pmp n’a pas été supprimé."
              fi
            fi
            mapfile -t numLines \
            < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"
            do
              sed -i "${n}d" /etc/fstab
            done
          done
        elif [ -d "$mp" ]
        then
          if [[ $mp =~ $rgx ]]
          then
            rmdir -v "$mp"
          else
            echo "$mp n’a pas été supprimé."
          fi
        fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$Label/d" /etc/fstab
        # Prise en compte du montage par le dash,
        # sans délai, parfois la partition ne s’affiche pas.
        sleep 1
        break
      ;;
      *)
      ;;
    esac
 done
}

if ((UID))
then
  echo -n "Vous devez être super utilisateur pour lancer ce script "
  echo "(essayez avec « sudo »)."
  exit 1
fi

declare -A ListPart
declare -A Rgx=(
  [fstype]='^(ext[2-4]|ntfs)'
  [mountP]='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
)

i=-1

while read -ra lsblkDT #path fstype mountpoint label
do
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]
  then
    if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]
    then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}"
      ListPart[$i,1]="${lsblkDT[1]}"
      if [[ ${lsblkDT[2]} =~ ^/ ]]
      then
        ListPart[$i,2]="${lsblkDT[2]}"
        ListPart[$i,3]="${lsblkDT[3]}"
      else
        ListPart[$i,2]=""
        ListPart[$i,3]="${lsblkDT[2]}"
      fi
    fi
  fi
done < <(lsblk -no path,fstype,mountpoint,label)

if ((${#ListPart[@]} == 0))
then
  echo "Il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/4))

echo
echo "n° ⇒  path   label   fstype   mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ ))
do
  if ((n+1 < 10)); then
    echo -n " $((n+1))  ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}"
    echo "   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  else
    echo -n " $((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}"
    echo "   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  fi
done
echo

while [ -z "$PartNum" ]
do
  echo -n "Choisissez le numéro correspondant "
  echo -n "à votre future partition de données : "
  read -r PartNum
  if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev))
  then
    echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"

if [ -z "$PartLabel" ]
then
  echo "La partition « $Part » n’a pas d’étiquette."
  label
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  while true
  do
    echo -n "Voulez-vous changer l’étiquette "
    echo -n "de la partition « $Part » ? [O/n] "
    read -r
    case $REPLY in
      N|n)
        Label="$PartLabel"
        break
      ;;
      Y|y|O|o|"")
        label
        break
      ;;
      *)
      ;;
    esac
  done
fi

while true
do
  echo -n "Voulez-vous procéder au montage maintenant pour la partition "
  echo -n "« $Part » en y mettant pour étiquette « $Label » ? [O/n] "
  read -r

  case $REPLY in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab
      then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        unmount        
      elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab
      then
        echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
        unmount
      elif grep -q "^$Part" /etc/mtab
      then
        echo "La partition « $Part » est déjà montée !"
        unmount
      fi

      # construction des éléments :
      if [[ $PartFstype =~ ext[2-4] ]]
      then
        e2label "$Part" "$Label"
        {
        echo -n "LABEL=$Label /media/$Label $PartFstype "
        echo "defaults,nofail,x-systemd.device-timeout=1"
        } >> /etc/fstab
      elif [ "$PartFstype" == "ntfs" ]
      then
        ntfslabel  "$Part" "$Label"
        {
        echo -n "LABEL=$Label /media/$Label ntfs3 defaults,"
        echo -n "nofail,x-systemd.device-timeout=1,x-gvfs-show,"
        echo "nohidden,uid=$SUDO_UID,gid=$SUDO_GID"
        } >> /etc/fstab
      fi
      if ! [ -d /media/"$Label" ]
      then
        mkdir -v /media/"$Label"
      fi
      systemctl daemon-reload
      if ! mount -a
      then
        exit 3
      fi

      if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]
      then
        mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
      if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]
      then
        mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
      chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"

      if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]
      then
        echo
        echo "-----------------------------------------------------------------"
        echo "Script pour montage de partition de données terminé avec succès !"
        echo
        echo -n "Vous pouvez maintenant accéder à votre partition en parcourant"
        echo " le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Hors ligne

#307 Le 25/04/2025, à 14:26

lynn

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

J’ai trouvé la « bizarrerie ».
C’est parce que tu avais testé avec une partition montée automatiquement (dans /media/$USER/<label>) et, lors du démontage, le point de montage est supprimé automatiquement.

Il n'est pas conseillé de monter quoi que ce soit dans /media, ça peut devenir source de problème. Mieux vaut utiliser un autre répertoire quitte à en créer un et même, pourquoi pas, à la racine du disque dur.
Certains utiliseront /mnt, d'autres diront que c'est fait pour du montage temporaire, peut importe mais en tout cas ce n'est pas /media qu'il faut utiliser pour un montage personnel et encore moins quand on vise à renseigner ce montage dans fstab ou via un service systemd.

Après, chacun fait ce qu'il veut... c'est bien l'avantage du libre ! smile


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#308 Le 25/04/2025, à 18:44

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

lynn a écrit :

Il n'est pas conseillé de monter quoi que ce soit dans /media, ça peut devenir source de problème.

Salut , a bon ?
sur le forum , au contraire il est souvent conseillé d ' utiliser ce repertoire , du coup , as tu des exemples de " problemes " ?
j' étais par contre au courant de l' " exclusivité " du répertoire /media/$USER , ça oui .


nany a écrit :

J’ai trouvé la « bizarrerie ».
C’est parce que tu avais testé avec une partition montée automatiquement (dans /media/$USER/<label>) et, lors du démontage, le point de montage est supprimé automatiquement.
L’erreur vient du fait qu’on teste à la fois la présence ou non du répertoire et s’il est dans /media/ ou /mnt/. Il faut en fait séparer les deux tests en imbriquant le second dans le premier :

oui exact .
cela dit pour  le "elif " , je parlais de celui-ci à la base ( depuis 3 messages ) :

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [[ -d $pmp && $pmp =~ $rgx ]]; then
              rmdir -v "$pmp"
            else
              echo "$pmp n’a pas été supprimé."
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        elif [[ -d $mp && $mp =~ $rgx ]]; then
            rmdir -v "$mp"
          elif [ -n "$mp" ]; then
            echo "$mp n’a pas été supprimé."

        fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$Label/d" /etc/fstab
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
done
}

que tu n' as pas remis dans ta dernière portion de code .


Petite question : que se passe-t-il si on a cent partitions ou plus ?

un décalage visuel , pas très zoli , Mais je doute fort que le gars qui a 100 partitions ou plus utilise ce script pour monter l' une d' entre elles tongue



iznobe a écrit :

    l' autre c' est la fonction label , je me suis dis que plutot que d ' arreter le script , il etait preferable de demander à l' utilisateur d ' entrer un autre label

Je ferais les tests en même temps plutôt que séparément. Donc, là aussi, un elif.

oui j' avais edité entre temps pour faire le test avec un elif car ça merdoyait un peu , et faisait double affichage ...


Pour la fonction unmount :

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [[ -d $pmp && $pmp =~ $rgx ]]; then
              rmdir -v "$pmp"
            else
              echo "$pmp n’a pas été supprimé."
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        elif [[ -d $mp && $mp =~ $rgx ]]; then
            rmdir -v "$mp"
        else
          echo "$mp n’a pas été supprimé."
        fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$Label/d" /etc/fstab
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
 done
}

quel est l' intérêt de vérifier tout ça :

local mp
  mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
...
elif [[ -d $mp && $mp =~ $rgx ]]; then
            rmdir -v "$mp"
        else
          echo "$mp n’a pas été supprimé."
        fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$Label/d" /etc/fstab

Cela me semble inutile et en double , vu que cette partie de code aura deja fait le boulot non :

if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [[ -d $pmp && $pmp =~ $rgx ]]; then
              rmdir -v "$pmp"
            else
              echo "$pmp n’a pas été supprimé."
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done

et comme j' avais deja dit avant , cette ligne recupere plus ou moins n ' importe quoi :

iznobe@iznobe-PC:~$ Label=to
iznobe@iznobe-PC:~$ mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
iznobe@iznobe-PC:~$ echo "$mp"
Use
device;
montage
https://github.com/trapexit/mergerfs		https://zackreed.me/mergerfs-another-good-option-to-pool-your-snapraid-disks/



#evisk/by-label/Sauvegardes			/media/Sauvegardes	ext4	defaults,noauto			0	2
/media/toi
iznobe@iznobe-PC:~$

Certes on teste que le contenu recuperé est un repertoire , mais un jour ou l' autre avec un peu de malchance , on tombera bien sur quelquechose qu ' il ne faut pas ...
puis je ne vois pas à quoi cela sert ...

Ha , c' est peut être pour supprimer les lignes du fstab d' une partition non montée ?
Dans ce cas, il faut peut etre mieux " circonscrire " , j' avais fait un bout de code dans la discussion pour justement traiter " Label " dans le fstab .
je vais retrouver ça roll

le voici :

if grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then

du coup , je remplacerai :

mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"

par :

mp="$(grep -E "(LABEL=|by-label/)$Label" /etc/fstab | cut -d ' ' -f 2)"

ca parait plus propre , vu le retour de cette dernière :

iznobe@iznobe-PC:~$ echo "$mp"
/media/toi
iznobe@iznobe-PC:~$

il me semble qu ' il n' y a que 2 façons de monter des partitions via leurs " labels " non  ???



Et sinon , pour finir , c' est quoi cette histoire de 80 colonnes ??

Dernière modification par iznobe (Le 25/04/2025, à 19:19)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#309 Le 25/04/2025, à 19:37

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

bon ca ne va pas non plus pour la ligne suivante ( toujours dans le fonction unmount ) :

sed -i "/$Label/d" /etc/fstab

ni pour celle-ci :

elif lsblk -no label | grep -q "$Label"; then

Perso , je verrai unmount  plutôt comme ça :

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local regLab="^(LABEL=|/dev/disk/by-label/)+$Label.+$"
  local mp="$(grep -E "$regLab" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        # traitement des partitions montées :
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [ -d "$pmp" ]; then
              if [[ $pmp =~ $rgx ]]; then
                rmdir -v "$pmp"
              else
                echo "$pmp n’a pas été supprimé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        # traitement des partitions NON montées :
        elif [ -d "$mp" ]; then
          if [[ $mp =~ $rgx ]]; then
            rmdir -v "$mp"            
          else
            echo "$mp n’a pas été supprimé."
          fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$regLab/d" /etc/fstab 
        fi
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
 done
}

Pas testé , mais quasi sûr que ça ne fonctionne pas roll

Dernière modification par iznobe (Le 25/04/2025, à 20:51)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#310 Le 25/04/2025, à 20:34

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

echo "$pmp n’a pas été supprimé." on dirait l'énoncé d'un problème ou d'une erreur, alors que c'est une simple information : echo "$pmp a été conservé."
non ?


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#311 Le 25/04/2025, à 20:49

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Modifications des lignes qui " ne vont pas " :

#!/bin/bash

# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------

LC_ALL=C

label() {
  local rgx="[^[:alnum:]_-]"

  while [ -z "$Label" ]; do
    read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
    if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]; then
      echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
      unset Label
    elif [[ lsblk -no label =~ $regLab ]]; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez-en une autre."
      unset Label
    fi
  done
}

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp="$(grep -E "$regFstabLab" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        # traitement des partitions montées :
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [ -d "$pmp" ]; then
              if [[ $pmp =~ $rgx ]]; then
                rmdir -v "$pmp"
              else
                echo "$pmp n’a pas été supprimé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        # traitement des partitions NON montées :
        elif [ -d "$mp" ]; then
          echo "$mp"
          if [[ $mp =~ $rgx ]]; then
            rmdir -v "$mp"
          else
            echo "$mp n’a pas été supprimé."
          fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$regFstabLab/d" /etc/fstab 
        fi
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
 done
}

if ((UID)); then
  echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
  exit 1
fi

declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"
regLab="^($Label)$"

i=-1


while read -ra lsblkDT; do #path fstype mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}"
      ListPart[$i,1]="${lsblkDT[1]}"
      if [[ ${lsblkDT[2]} =~ ^/ ]]; then
        ListPart[$i,2]="${lsblkDT[2]}"
        ListPart[$i,3]="${lsblkDT[3]}"
      else
        ListPart[$i,2]=""
        ListPart[$i,3]="${lsblkDT[2]}"
      fi
    fi
  fi
done < <(lsblk -no path,fstype,mountpoint,label)

if ((${#ListPart[@]} == 0)); then
  echo "Il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/4))

echo
echo " n° ⇒    path    label   fstype   mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  if ((n+1 < 10)); then
    echo " $((n+1))  ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  else
    echo " $((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  fi
done
echo

while [ -z "$PartNum" ]; do
  read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
  if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
    echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"

if [ -z "$PartLabel" ]; then
  echo "La partition « $Part » n’a pas d’étiquette."
  label
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  while true; do
    read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
    case "$REPLY" in
      N|n)
        Label="$PartLabel"
        break
      ;;
      Y|y|O|o|"")
        label
        break
      ;;
      *)
      ;;
    esac
  done
fi

while true; do
  read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "

  case "$REPLY" in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        unmount        
      elif grep -Eq "$regFstabLab" /etc/fstab; then # elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
        echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
        unmount
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        unmount
      fi

      # construction des éléments :
      if [[ $PartFstype =~ ext[2-4] ]]; then
        e2label "$Part" "$Label"
        echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
      elif [ "$PartFstype" == "ntfs" ]; then
        ntfslabel  "$Part" "$Label"
        echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
      fi
      if ! [ -d /media/"$Label" ]; then
        mkdir -v /media/"$Label"
      fi
      systemctl daemon-reload
      if ! mount -a; then
        exit 3
      fi

      if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
        mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
      if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
      chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"

      if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        echo
        echo "-----------------------------------------------------------------"
        echo "Script pour montage de partition de données terminé avec succès !"
        echo
        echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Dernière modification par iznobe (Le 25/04/2025, à 20:50)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#312 Le 25/04/2025, à 21:29

lynn

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

Salut , a bon ?
sur le forum , au contraire il est souvent conseillé d ' utiliser ce repertoire , du coup , as tu des exemples de " problemes " ?
j' étais par contre au courant de l' " exclusivité " du répertoire /media/$USER , ça oui .

J'ai toujours entendu dire que le système utilisait /media pour créer ses points de montages pour les disques amovibles, cd, usb etc. Maintenant c'est dans /media/$USER mais certains logiciels créent leurs répertoires à la racine de /media. Récemment, nomachine m'a créé un répertoire «nomachine» à la racine de /media...

C'est capillotracté mais que se passerait-il si un logiciel avait besoin de créer dans /media, un répertoire du même nom que l'un de tes points de montage manuel ?


«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#313 Le 25/04/2025, à 21:33

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

man hier a écrit :

       /media This directory contains mount points for removable media such as CD and DVD disks or USB sticks.  [...]


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#314 Le 25/04/2025, à 22:00

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

j ' ai mis " regLab "en variable " globale " pensant qu ' on en avait besoin ailleurs , mais à priori ce n' est pas le cas .
on peut donc la mettre en local à la fonction " label " je pense.

@watael et aux autres , Rien à dire  sur les dernières modifications apportées ?

Pour la modification des points de montage à la racine , lors mes essais , je me rappelle que ce n' est pas forcément si évident que cela , j ' avais bien galeré sur un un point particulier , mais je ne sais plus trop si c' est pour les permissions ou si  c' était du au fait que ça ne supporte pas les signes diacritiques ( si c' est ce dernier point , en tout cas , on ne devrait pas être embêté puisque il directement lié a " LABEL " et que c' est exclu pour celui-ci ) .

Dans " man hier " , il n' y a rien de prévu spécifiquement pour monter les partitions " en dur " , ou alors j' ai raté l' info roll ( apres comme le script peut aussi servir à monter des partitions externes ... )

Par contre , il ne date pas vraiment d' hier tongue :

man hier a écrit :
STANDARDS
       The Filesystem Hierarchy Standard (FHS), Version 3.0, published March 19, 2015




Sinon , lors de mes essais avec le script , je rencontre régulièrement des erreurs du même type :

mount: /media/po: /dev/nvme0n1p12 déjà monté ou point de montage actif.
       dmesg(1) may have more information after failed mount system call.
iznobe@iznobe-PC:~/Scripts$ 

et du coup , il ne poursuit pas ... ( normal vu le " exit 3 " ) , mais bon , logiquement il devrait non ?


Alors voici , avec le répertoire " conservé " plutôt que non supprimé et la variable regLab en local a label :

#!/bin/bash

# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------

LC_ALL=C

label() {
  local rgx="[^[:alnum:]_-]"
  local regLab="^($Label)$"

  while [ -z "$Label" ]; do
    read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
    if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]; then
      echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
      unset Label
    elif [[ $(lsblk -no label) =~ $regLab ]]; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée ! Choisissez-en une autre."
      unset Label
    fi
  done
}

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp="$(grep -E "$regFstabLab" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        # traitement des partitions montées :
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [ -d "$pmp" ]; then
              if [[ $pmp =~ $rgx ]]; then
                rmdir -v "$pmp"
              else
                echo "$pmp a été conservé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        # traitement des partitions NON montées :
        elif [ -d "$mp" ]; then
          echo "$mp"
          if [[ $mp =~ $rgx ]]; then
            rmdir -v "$mp"
          else
            echo "$mp a été conservé."
          fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$regFstabLab/d" /etc/fstab 
        fi
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
 done
}

if ((UID)); then
  echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
  exit 1
fi

declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"

i=-1


while read -ra lsblkDT; do #path fstype mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}"
      ListPart[$i,1]="${lsblkDT[1]}"
      if [[ ${lsblkDT[2]} =~ ^/ ]]; then
        ListPart[$i,2]="${lsblkDT[2]}"
        ListPart[$i,3]="${lsblkDT[3]}"
      else
        ListPart[$i,2]=""
        ListPart[$i,3]="${lsblkDT[2]}"
      fi
    fi
  fi
done < <(lsblk -no path,fstype,mountpoint,label)

if ((${#ListPart[@]} == 0)); then
  echo "Il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/4))

echo
echo " n° ⇒    path    label   fstype   mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  if ((n+1 < 10)); then
    echo " $((n+1))  ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  else
    echo " $((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  fi
done
echo

while [ -z "$PartNum" ]; do
  read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
  if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
    echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"

#umount -v /media/"$PartLabel"

if [ -z "$PartLabel" ]; then
  echo "La partition « $Part » n’a pas d’étiquette."
  label
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  while true; do
    read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
    case "$REPLY" in
      N|n)
        Label="$PartLabel"
        break
      ;;
      Y|y|O|o|"")
        label
        break
      ;;
      *)
      ;;
    esac
  done
fi

while true; do
  read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] "

  case "$REPLY" in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        unmount        
      elif grep -Eq "$regFstabLab" /etc/fstab; then # elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
        echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
        unmount
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        unmount
      fi

      # construction des éléments :
      if [[ $PartFstype =~ ext[2-4] ]]; then
        e2label "$Part" "$Label"
        echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
      elif [ "$PartFstype" == "ntfs" ]; then
        ntfslabel  "$Part" "$Label"
        echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
      fi
      if ! [ -d /media/"$Label" ]; then
        mkdir -v /media/"$Label"
      fi
      systemctl daemon-reload
      if ! mount -a; then
        exit 3
      fi

      if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
        mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
      if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
      fi
      chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
      chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"

      if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        echo
        echo "-----------------------------------------------------------------"
        echo "Script pour montage de partition de données terminé avec succès !"
        echo
        echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done




@nany , je suis toujours pas convaincu pour :

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  local mp
  mp="$(grep -E "$regFstabLab" /etc/fstab | cut -d ' ' -f 2)"

  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        # traitement des partitions montées :
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [ -d "$pmp" ]; then
              if [[ $pmp =~ $rgx ]]; then
                rmdir -v "$pmp"
              else
                echo "$pmp a été conservé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        # traitement des partitions NON montées :
        elif [ -d "$mp" ]; then
          echo "$mp"
          if [[ $mp =~ $rgx ]]; then
            rmdir -v "$mp"
          else
            echo "$mp a été conservé."
          fi
        sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        sed -i "/$regFstabLab/d" /etc/fstab
        fi
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
done
}

Comme on peut avoir des partitions montées plusieurs fois , on peut tres bien avoir un utilisateur ( rencontrer des cas ) qui possedent plusieurs lignes dans le fstab et que pour l' une d' elles la partition ne soit pas montée ...

2 " if " me parait couvrir tous les cas , contrairement a un if elif .

Dernière modification par iznobe (Le 25/04/2025, à 22:57)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#315 Le 27/04/2025, à 12:26

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour,



Je n’ai que peu de temps en ce moment donc réponse rapide.


iznobe a écrit :

Ha , c' est peut être pour supprimer les lignes du fstab d' une partition non montée ?

Oui.




iznobe a écrit :

Et sinon , pour finir , c' est quoi cette histoire de 80 colonnes ??

C’est pour respecter l’antique contrainte des 80 colonnes des cartes perforées IBM.
Même si j’ai fait remarquer que Linus Torvalds trouve ça has been. Je ne suis pas entièrement d’accord avec lui. Je trouve que l’affichage en 80 colonnes plus agréable à lire même s’il n’est pas forcément plus lisible.




iznobe a écrit :

@watael et aux autres , Rien à dire  sur les dernières modifications apportées ?

iznobe a écrit :
  local regLab="^($Label)$"

Ça ne marche pas sans parenthèse ?

iznobe a écrit :
regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"

Avec le dollar à la fin, cette expression régulière cherche les lignes qui ne contienne que LABEL=$Label ou /dev/disk/by-label/$Label dans fstab, ce qui ne devrait a priori jamais matcher.




iznobe a écrit :

Comme on peut avoir des partitions montées plusieurs fois , on peut tres bien avoir un utilisateur ( rencontrer des cas ) qui possedent plusieurs lignes dans le fstab et que pour l' une d' elles la partition ne soit pas montée ...

2 " if " me parait couvrir tous les cas , contrairement a un if elif .

Oui.

Hors ligne

#316 Le 27/04/2025, à 12:42

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

Bonjour,

iznobe a écrit :

Et sinon , pour finir , c' est quoi cette histoire de 80 colonnes ??

C’est pour respecter l’antique contrainte des 80 colonnes des cartes perforées IBM.
Même si j’ai fait remarquer que Linus Torvalds trouve ça has been. Je ne suis pas entièrement d’accord avec lui. Je trouve que l’affichage en 80 colonnes plus agréable à lire même s’il n’est pas forcément plus lisible.

oui c' est vrai que ca se lis bien , mais ca implique des repetitions de commande , par exemple 3 echo au lieu d' un .

nany a écrit :
iznobe a écrit :

@watael et aux autres , Rien à dire  sur les dernières modifications apportées ?

iznobe a écrit :
local regLab="^($Label)$"

Ça ne marche pas sans parenthèse ?

j ' ai meme pas pas essayé sans roll .

nany a écrit :
iznobe a écrit :
regFstabLab="^(LABEL=|/dev/disk/by-label/)$Label$"

Avec le dollar à la fin, cette expression régulière cherche les lignes qui ne contienne que LABEL=$Label ou /dev/disk/by-label/$Label dans fstab, ce qui ne devrait a priori jamais matcher.

Ha , je vais tester plus précisément cela alors  .

Dernière modification par iznobe (Le 27/04/2025, à 16:21)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#317 Le 27/04/2025, à 13:42

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

printf '%s ' \
    "Choisissez l’étiquette (LABEL) de votre partition de données," \
    "elle doit être UNIQUE et ne pas contenir d’espace, d’accent," \
    "de caractères spéciaux et au maximum 16 caractères :"

et hop! une seule commande.

Dernière modification par Watael (Le 27/04/2025, à 13:42)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#318 Le 27/04/2025, à 18:54

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

bon , je ne sais pas si c' est à cause du bug , mais je ne suis pas arrivé a utilisé la regex regFstabLabel . je l' ai virée du coup ... Ca fonctionne sans .

Idem , la fonction choixlabel est dans les choux . pas compris pourquoi , mais ne fonctionne pas du coup .
le probleme avec l ' ancienne version ( grep ) c' est que si l' ancienne etiquette est par exemple " pol " et que l' on choisis pour la nouvelle " po " , alors forcément ca matche roll

on a fait un grosse bourde avec Label ...

Du coup modification de noms de fonction et de variables pour ne plus s' emmêler les pinceaux et quelques modifs du code .

cette ligne était à la fois pas assez précise et surtout elle n' utilisait pas la bonne variable :

elif lsblk -no label | grep -q "$Label"; then

on aurait du y mettre $PartLabel comme variable à la place de $Label .


nouveau script :

#!/bin/bash

# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------

LC_ALL=C

choixlabel() {
  local rgx="[^[:alnum:]_-]"

  while [ -z "$newLabel" ]; do    
    read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " newLabel
    if [[ $newLabel =~ $rgx || ${#newLabel} -gt 16 ]]; then
      echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
      unset newLabel
    fi
    mapfile -t labels < <(lsblk -no label)
    if [ -n "${labels[0]}" ]; then
      for lab in "${labels[@]}"; do
        if [[ $lab =~ ^$newLabel$ ]]; then
          echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
          unset newLabel
        fi
      done
    fi
  done    
}

unmount() {
  local rgx="^(/mnt/|/media/).+$"
  while true; do
    read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $newLabel » ? [O/n] "
    case "$REPLY" in
      N|n)
        echo "Annulation par l’utilisateur !"
        exit 0
      ;;
      Y|y|O|o|"")
        # traitement des partitions montées :
        mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
        if [ -n "${PartMountPoints[0]}" ]; then
          for pmp in "${PartMountPoints[@]}"; do
            umount -v "$pmp"
            if [ -d "$pmp" ]; then
              if [[ $pmp =~ $rgx ]]; then
                rmdir -v "$pmp"
              else
                echo "$pmp a été conservé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab
            done
          done
        fi

        # traitement des partitions NON montées :
        mapfile -t mountPoints < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
        if [ -n "${mountPoints[0]}" ]; then
          for mp in "${mountPoints[@]}"; do
            if [ -d "$mp" ]; then
              if [[ $mp =~ $rgx ]]; then
                rmdir -v "$mp"
              else
                echo "$mp a été conservé."
              fi
            fi
            mapfile -t numLines < <(grep -n "$mp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
            for n in "${numLines[@]}"; do
              sed -i "${n}d" /etc/fstab              
            done
          done
        #sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
        fi
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        break
      ;;
      *)
      ;;
    esac
 done
}

if ((UID)); then
  echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
  exit 1
fi

declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )

i=-1


while read -ra lsblkDT; do #path fstype mountpoint label
  if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
    if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
      continue
    else
      ((++i))
      ListPart[$i,0]="${lsblkDT[0]}"
      ListPart[$i,1]="${lsblkDT[1]}"
      if [[ ${lsblkDT[2]} =~ ^/ ]]; then
        ListPart[$i,2]="${lsblkDT[2]}"
        ListPart[$i,3]="${lsblkDT[3]}"
      else
        ListPart[$i,2]=""
        ListPart[$i,3]="${lsblkDT[2]}"
      fi
    fi
  fi
done < <(lsblk -no path,fstype,mountpoint,label)

if ((${#ListPart[@]} == 0)); then
  echo "Il n’y a pas de partition susceptible d’être montée."
  exit 2
fi

nbDev=$(("${#ListPart[@]}"/4))

echo
echo " n° ⇒    path    label   fstype   mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  if ((n+1 < 10)); then
    echo " $((n+1))  ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  else
    echo " $((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
  fi
done
echo

while [ -z "$PartNum" ]; do
  read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
  if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
    echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
    unset PartNum
  fi
done

Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"

#umount -v /media/"$PartLabel"

if [ -z "$PartLabel" ]; then
  echo "La partition « $Part » n’a pas d’étiquette."
  choixlabel
else
  echo "La partition « $Part » a l’étiquette « $PartLabel »."
  while true; do
    read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
    case "$REPLY" in
      N|n)
        newLabel="$PartLabel"
        break
      ;;
      Y|y|O|o|"")
        choixlabel
        break
      ;;
      *)
      ;;
    esac
  done
fi

while true; do
  read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "

  case "$REPLY" in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
      fi
      unmount

      # construction des éléments :
      if [[ $PartFstype =~ ext[2-4] ]]; then
        e2label "$Part" "$newLabel"
        echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
      elif [ "$PartFstype" == "ntfs" ]; then
        ntfslabel  "$Part" "$newLabel"
        echo "LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
      fi
      if ! [ -d /media/"$newLabel" ]; then
        mkdir -v /media/"$newLabel"
      fi
      systemctl daemon-reload
      if ! mount -a; then
        echo "erreur innatendue , annulation des modifications !"
        rmdir -v /media/"$newLabel"
        systemctl daemon-reload
        exit 3
      fi

      if ! [ -d /media/"$newLabel"/"$SUDO_USER"-"$newLabel" ]; then
        mkdir -v /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
      fi
      chown -c "$SUDO_USER": /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
      if ! [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
        mkdir -v /media/"$newLabel"/.Trash-"$SUDO_UID"
      fi
      chown -c "$SUDO_USER": /media/"$newLabel"/.Trash-"$SUDO_UID"
      chmod -c 700 /media/"$newLabel"/.Trash-"$SUDO_UID"

      if [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
        echo
        echo "-----------------------------------------------------------------"
        echo "Script pour montage de partition de données terminé avec succès !"
        echo
        echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel »."
        xdg-open "/media/$newLabel/$SUDO_USER-$newLabel"
      else
        echo "Erreur inconnue !"
        exit 4
      fi
      break
    ;;
    *)
    ;;
  esac
done

Dernière modification par iznobe (Le 27/04/2025, à 20:49)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#319 Le 27/04/2025, à 22:22

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

J’ai omis de répondre à ça :

iznobe a écrit :

Sinon , lors de mes essais avec le script , je rencontre régulièrement des erreurs du même type :

mount: /media/po: /dev/nvme0n1p12 déjà monté ou point de montage actif.
       dmesg(1) may have more information after failed mount system call.
iznobe@iznobe-PC:~/Scripts$ 

et du coup , il ne poursuit pas ... ( normal vu le " exit 3 " ) , mais bon , logiquement il devrait non ?

L’exit est dû au problème que j’ai rencontré.
Pour ton cas, il faudrait voir pourquoi la partition est déjà montée.
Ça me semble être du cas par cas et difficilement scriptable, donc je pense que l’exit est préférable dans tous les cas.




iznobe a écrit :

oui c' est vrai que ca se lis bien , mais ca implique des repetitions de commande , par exemple 3 echo au lieu d' un .

Certes mais je préfère. Et, comme l’a fait remarquer Watael, il est possible d’utiliser printf pour n’avoir qu’une commande.




iznobe a écrit :

bon , je ne sais pas si c' est à cause du bug , mais je ne suis pas arrivé a utilisé la regex regFstabLabel . je l' ai virée du coup lol

Je m’y perds dans tous ces changements. Je regarderai quand j’aurai du temps et à tête reposée.

Hors ligne

#320 Le 28/04/2025, à 15:02

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

en fait , je n' ai pas changé grand chose .
le nom de la fonction pouvait porter a confusion , avant : label , apres choixlabel .
Dans cette fonction , on utilisait un " simple " grep $label , sauf que , si la nouvelle étiquette est contenue dans l ' ancienne , ca ne marche pas . exemple pier-paul et pier ou paul ...
j ' ai donc modifié le code pour passer par une regex avec debut et fin de mot , ce qui supprimera ce " phénomène " non desiré .

En suite , j ' ai changé le nom de la variable " label " , par newlabel " , ce qui je l' espère , nous evitera ultérieurement de nous emmêler les pinceaux ..
et le dernier changement , c' est pour le cas ou  , la partition ne serait pas montée , mais que le fstab comporterait plusieurs lignes , peu de chances , mais avec les zigs ... vaut mieux prévoir . j ' ai don repris la façon de faire de watael ( je crois pour creer un tabbleau et boucler pour les rmdir et le fstab ) , puisque la ligne sed pour les UUID gere a elle seule toutes les entrées via UUID .


Voilà pour les explications .

le seul truc qui ne marche pas , c ' est cette partie de code :

    mapfile labels < <(lsblk -no label)
    if [ -n "${labels[0]}" ]; then
      for lab in "${labels[@]}"; do
        if [[ $lab =~ ^$newLabel$ ]]; then
          echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
          unset newLabel
        fi
      done
    fi
  done   

j' ai aussi essayé avec :

mapfile labels < <(lsblk -no label)
    if [ -n "${labels[0]}" ]; then
      for lab in "${labels[@]}"; do
        echo "$lab=$newLabel"
        if [[ "$lab" == "$newLabel" ]]; then
          echo "OK"
          unset newLabel
          break
        fi
      done
    fi

OK ne s' affiche pas , alors qu ' évidemment , pour mon test j ' indique une étiquette deja utilisé .
voici ce que j' obtiens avec le code ci-dessus :

Choisissez le numéro correspondant à votre future partition de données : 16
La partition « /dev/nvme0n1p12 » a l’étiquette « SSD_BOOTEFI ».
Voulez-vous changer l’étiquette de la partition « /dev/nvme0n1p12 » ? [O/n] 
Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : SSD_BOOTEFI
=SSD_BOOTEFI
WD8
=SSD_BOOTEFI
SAUV
=SSD_BOOTEFI

=SSD_BOOTEFI
Data
=SSD_BOOTEFI

=SSD_BOOTEFI

=SSD_BOOTEFI
WD8PRO1_P1
=SSD_BOOTEFI
WD8PRO1_P2
=SSD_BOOTEFI

=SSD_BOOTEFI
WD8PRO2
=SSD_BOOTEFI

=SSD_BOOTEFI

=SSD_BOOTEFI

=SSD_BOOTEFI
windows_10
=SSD_BOOTEFI

=SSD_BOOTEFI
SSD_BOOTEFI
=SSD_BOOTEFI

=SSD_BOOTEFI
LM_21_SSD
=SSD_BOOTEFI
U_20.04_SSD
=SSD_BOOTEFI
U_22.budgie_SSD
=SSD_BOOTEFI
U_24.04_SSD
=SSD_BOOTEFI
LM_SSD_NEW
=SSD_BOOTEFI
DEBIAN_XFCE
=SSD_BOOTEFI
Archlinux
=SSD_BOOTEFI
SSD_BOOTEFI
=SSD_BOOTEFI
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « SSD_BOOTEFI » ? [O/n]

Dernière modification par iznobe (Le 28/04/2025, à 16:04)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#321 Le 28/04/2025, à 16:16

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

    mapfile labels < <(lsblk -no label)
    if [ -n "${labels[0]}" ]; then
      for lab in "${labels[@]}"; do

avec shopt -s nullglob (à ajouter au début du script), puisqu'il n'y a pas de el(se/if; else), tu peux te dispenser du if test -n "${labels[0]}" : la boucle ne sera pas effectuée quand elle n'aura pas de liste sur laquelle itérer.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#322 Le 28/04/2025, à 16:21

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Salut et merci Watael .

Peut etre , mais comme ça ne marche pas ... chaque chose en son temps .

Sais tu pour quoi la condition n' est pas validée ?

if [[ "$lab" == "$newLabel" ]]; then
          echo "OK"
...

alors que le echo de la boucle me sort bien :

SSD_BOOTEFI
=SSD_BOOTEFI

Dernière modification par iznobe (Le 28/04/2025, à 16:27)


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#323 Le 28/04/2025, à 16:40

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

mapfile -t labels, sinon il y a un alinéa à la fin de chaque élément du tableau. :

$ mapfile < <(printf '%s\n' foo bar baz)
$ for i in "${MAPFILE[@]}"; do echo ">$i<"; done
>foo
<
>bar
<
>baz
<
$ 
help mapfile a écrit :

-t        Retire les retours à la ligne de chaque ligne lue.

Dernière modification par Watael (Le 28/04/2025, à 16:42)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#324 Le 28/04/2025, à 18:17

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

si j' ajoute " -t " , il n' y a pas de tableau ...


retour COMPLET et utilisable de commande  |  script montage partitions

MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#325 Le 28/04/2025, à 19:31

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

fait voir un

mapfile -t labels < <(lsblk -no label)
for i in ${!labels[@]}; do echo "$i - ${labels[i]}"; done

Connected \o/
Welcome to sHell. · eval is evil.

En ligne