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.

#251 Le 19/04/2025, à 07:40

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

PS : un ptit truc me chiffonne , avant , dans le " AWK " , avec le champ  " label " qui pouvait être vide , on ajoutait une " case " vide au tableau pour pouvoir diviser par le nombre de " case " de chaque ligne ( 3 ) .
Là , tu as ajouté un champ : " mountpoint " , qui lui aussi peut etre vide . par contre , tu ne gères plus de la même manière les champs vides .

Quelle est la subtilité ?

La subtilité, c’est l’ordre de lsblk. Les champs 1 et 2 sont forcément renseignés et ce sont eux qui nous intéressent. Ensuite, que les champs 3 et 4 soient vides, on s’en balek’.

[edit]
En fait, non, je dit n’importe quoi. Si la partition n’est pas montée et qu’elle a une étiquette, cette dernière ne sera pas récupérée.
Je dois donc revoir cette partie du code.
[/edit]

Dernière modification par nany (Le 19/04/2025, à 07:43)

En ligne

#252 Le 19/04/2025, à 07:47

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

La subtilité, c’est l’ordre de lsblk.

Dés le départ , j ' avais testé cela ( au moment ou je voulais recuperer le point de montage pour éviter de passer par le fichier mtab ) , mais j ' ai probablement du m ' emmêler les pinceaux , car ca n ' allait pas roll

Bref , j ' ai modifié la regex .
Merci pour tes explications , ton temps et ton aide !

Hors ligne

#253 Le 19/04/2025, à 07:51

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Messages croisés, j’ai édité mon message précédent.
À+, donc.

En ligne

#254 Le 19/04/2025, à 07:55

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

oui , j ' ai vu wink

EDIT1 : Vu que le champ " mountpoint " n ' est pas utile ( meme si ca presente bien , j' avoue ) , je me dis que pour ne pas que ca devienne quasi ingérable et incompréhensible , il vaut mieux revenir à la version à 3 champs , non ?
en incorporant les dernières modifs , cela va de soi .


EDIT2 : ha ba en fait , c' est pas possible ( mountpoint est indispensable ) et label , ca serait dommage mais possible de faire une commande séparée .

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

Hors ligne

#255 Le 19/04/2025, à 08:13

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

idée : vu que le champ label ( dans le AWK je parle ) , ne peut pas contenir de caractères spéciaux , autant en ajouter un nous même ( qu ' il est impossible de mettre dans linux et dans windobz bien sur ).
ca nous permettra d' avoir un " fin de ligne " pour scinder non ?
par exemple :

print "ListPart["++i",0]="$1"\nListPart["i",1]="$2"\nListPart["i",2]="$3"\nListPart["i",3]="$4 !}

reste plus qu ' a compter le nombre de " ! "  et a scinder juste apres " ! " pour exploiter chaque ligne correspondant a une partition ?

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

Hors ligne

#256 Le 19/04/2025, à 08:27

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Non, ce n’est pas possible.


Voilà ce que j’ai fait pour corriger :

$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" } 
$2 ~ "ext|ntfs" {
  if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
    next  
  }
  else if ($3 ~ "^/") {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]="$3"\nListPart["i",3]="$4
  }
  else {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]=\nListPart["i",3]="$3
  }
}')

La variable rgx_no_list n’est plus utilisée donc la ligne de sa déclaration peut être supprimée.
Je ne peux pas tester actuellement.

Il faudrait tester avec une partition non montée avec une étiquette.

Dernière modification par nany (Le 19/04/2025, à 08:31)

En ligne

#257 Le 19/04/2025, à 08:33

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Il faudrait tester avec une partition non montée avec une étiquette.

tester quoi si elle eslt listée ?
elles l' étaient deja avant , exemple :

iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh 

n° ⇒  path   label   fstype   mountpoint
----------------------------------------
1 ⇒ /dev/sda1   WD8   ext4   /media/Videos/WD8
2 ⇒ /dev/sda2      ext4   SAUV
3 ⇒ /dev/sdb3   Data   ext4   /datas
4 ⇒ /dev/sdc1   WD8PRO1_P1   ext4   /media/WD8PRO1_P1
5 ⇒ /dev/sdc2   WD8PRO1_P2   ext4   /media/Videos/WD8PRO1_P2
6 ⇒ /dev/sdd1   WD8PRO2   ext4   /media/Videos/WD8PRO2
7 ⇒ /dev/nvme0n1p1      ntfs   windows_10
8 ⇒ /dev/nvme0n1p2      ntfs   
9 ⇒ /dev/nvme0n1p4      ntfs   
10 ⇒ /dev/nvme0n1p5      ext4   LM_21_SSD
11 ⇒ /dev/nvme0n1p6      ext4   U_20.04_SSD
12 ⇒ /dev/nvme0n1p7      ext4   U_22.budgie_SSD
13 ⇒ /dev/nvme0n1p9      ext4   LM_SSD_NEW
14 ⇒ /dev/nvme0n1p10      ext4   DEBIAN_XFCE
15 ⇒ /dev/nvme0n1p11      ext4   Archlinux
16 ⇒ /dev/nvme0n1p12   rety   ext4   /mnt/test

Choisissez le numéro correspondant à votre future partition de données : 16
La partition « /dev/nvme0n1p12 » a l’étiquette « rety ».
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 : yhft
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « yhft » ? [O/n] 
L’UUID de la partition est déjà présent dans le fstab !
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « yhft » ? [O/n] 
umount: /media/rety (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/rety'
umount: /mnt: la cible est active.
/mnt n’a pas été supprimé.
umount: /mnt/test démonté
rmdir: suppression du répertoire, '/mnt/test'
-----------------------------------------------------------------
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/yhft/iznobe-yhft ».
iznobe@iznobe-pc:~/Scripts$ 

la numero 2 entre dans le cas de figure que tu demandes de tester . elle a une etiquette et n' est actuellement pas montée , et bel et bien listée avec l' ancien code " AWK " .

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

Hors ligne

#258 Le 19/04/2025, à 08:46

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

tester quoi si elle eslt listée ?

Non, ça c’est OK.

iznobe a écrit :

la numero 2 entre dans le cas de figure que tu demandes de tester . elle a une etiquette et n' est actuellement pas montée , et bel et bien listée avec l' ancien code " AWK " .

Oui, voilà, il faudrait la choisir pour voir si le label est bien récupéré.


Mais je soupçonne déjà que non vu que l’affichage de la liste est bizarre.

En ligne

#259 Le 19/04/2025, à 09:06

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

avec le AWK de 4 champs 1er jet :

$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_list" \
'BEGIN { print "declare -A ListPart" } 
$2 ~ "ext|ntfs" \
{
  if ($3 ~ re)
    { next }
  else
    { print "ListPart["++i",0]="$1"\nListPart["i",1]="$2"\nListPart["i",2]="$3"\nListPart["i",3]="$4 }
}')

resultat :

iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh 

n° ⇒  path   label   fstype   mountpoint
----------------------------------------
1 ⇒ /dev/sda1   WD8   ext4   /media/Videos/WD8
2 ⇒ /dev/sda2      ext4   SAUV
3 ⇒ /dev/sdb3   Data   ext4   /datas
4 ⇒ /dev/sdc1   WD8PRO1_P1   ext4   /media/WD8PRO1_P1
5 ⇒ /dev/sdc2   WD8PRO1_P2   ext4   /media/Videos/WD8PRO1_P2
6 ⇒ /dev/sdd1   WD8PRO2   ext4   /media/Videos/WD8PRO2
7 ⇒ /dev/nvme0n1p1      ntfs   windows_10
8 ⇒ /dev/nvme0n1p2      ntfs   
9 ⇒ /dev/nvme0n1p4      ntfs   
10 ⇒ /dev/nvme0n1p5      ext4   LM_21_SSD
11 ⇒ /dev/nvme0n1p6      ext4   U_20.04_SSD
12 ⇒ /dev/nvme0n1p7      ext4   U_22.budgie_SSD
13 ⇒ /dev/nvme0n1p9      ext4   LM_SSD_NEW
14 ⇒ /dev/nvme0n1p10      ext4   DEBIAN_XFCE
15 ⇒ /dev/nvme0n1p11      ext4   Archlinux
16 ⇒ /dev/nvme0n1p12   1234567891234567   ext4   /media/tretr

Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sda2 » n’a pas d’étiquette.
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 : 

Hors ligne

#260 Le 19/04/2025, à 09:09

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

avec le nouveau :

iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh 

n° ⇒  path   label   fstype   mountpoint
----------------------------------------
1 ⇒ /dev/sda1   WD8   ext4   /media/Videos/WD8
2 ⇒ /dev/sda2   SAUV   ext4   
3 ⇒ /dev/sdb3   Data   ext4   /datas
4 ⇒ /dev/sdc1   WD8PRO1_P1   ext4   /media/WD8PRO1_P1
5 ⇒ /dev/sdc2   WD8PRO1_P2   ext4   /media/Videos/WD8PRO1_P2
6 ⇒ /dev/sdd1   WD8PRO2   ext4   /media/Videos/WD8PRO2
7 ⇒ /dev/nvme0n1p1   windows_10   ntfs   
8 ⇒ /dev/nvme0n1p2      ntfs   
9 ⇒ /dev/nvme0n1p4      ntfs   
10 ⇒ /dev/nvme0n1p5   LM_21_SSD   ext4   
11 ⇒ /dev/nvme0n1p6   U_20.04_SSD   ext4   
12 ⇒ /dev/nvme0n1p7   U_22.budgie_SSD   ext4   
13 ⇒ /dev/nvme0n1p9   LM_SSD_NEW   ext4   
14 ⇒ /dev/nvme0n1p10   DEBIAN_XFCE   ext4   
15 ⇒ /dev/nvme0n1p11   Archlinux   ext4   
16 ⇒ /dev/nvme0n1p12   1234567891234567   ext4   /media/tretr

Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sda2 » a l’étiquette « SAUV ».
Voulez-vous changer l’étiquette de la partition « /dev/sda2 » ? [O/n]

donc là , on voit bien que l' étiquette est récupérée correctement .

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

Hors ligne

#261 Le 19/04/2025, à 09:17

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bon, eh bien, c’est tout ce que je voulais savoir. Tu peux répondre n aux questions.

En ligne

#262 Le 19/04/2025, à 09:28

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Voici donc à quoi devrait ressembler le script après modification :

#!/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.
# ----------------------------------------------------------------------------

label() {
  local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"

  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
  done
  for (( n=0; n<"$nbDev"; n++ )); do
    if [[ $Label == "${ListPart[$n,3]}" ]]; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
      exit 4
    fi
  done
}

unmount() {
  local rgx="^(/mnt/|/media/).+$"

  while [ -z "$rep3" ]; 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] " Rep3
    case "$Rep3" in
      N|n)
        echo "Annulation par l’utilisateur !"
        unset Rep3
        exit 0
      ;;
      Y|y|O|o|"")
        PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
        for pmp in "${PartMountPoints[@]}"; do
          umount -v "$pmp"
          if [[ "$pmp" =~ $rgx ]]; then
            rmdir -v "$pmp"
          else
            echo "$pmp n’a pas été supprimé."
          fi
          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
        sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
        unset Rep3
        break
      ;;
      *)
        unset Rep3
      ;;
    esac
 done
}

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

$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" } 
$2 ~ "ext|ntfs" {
  if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
    next  
  }
  else if ($3 ~ "^/") {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]="$3"\nListPart["i",3]="$4
  }
  else {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]=\nListPart["i",3]="$3
  }
}')

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

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

echo
echo "n° ⇒  path   label   fstype   mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  echo "$((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
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 [ -z "$Rep" ]; do
    read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
    case "$Rep" in
      N|n)
        Label="$PartLabel"
        unset Rep
        break
      ;;
      Y|y|O|o|"")
        label
        unset Rep
        break
      ;;
      *)
        unset Rep
      ;;
    esac
  done
fi

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

  case "$Rep2" in
    N|n)
      echo "Annulation par l’utilisateur !"
      unset Rep2
      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
      mkdir /media/"$Label" 2>/dev/null
      systemctl daemon-reload
      mount -a 2>/dev/null

      mkdir /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
      chown "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
      mkdir /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
      chown "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
      chmod 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null

      if [ -e /media/"$Label"/.Trash-"$SUDO_UID" ]; then
        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 10
      fi
      unset Rep2
      break
    ;;
    *)
      unset Rep2
    ;;
  esac
done

En ligne

#263 Le 19/04/2025, à 09:32

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

ok , j ' ai remis la regex pour le $2 AWK en plus " précise " :

$2 ~ "^(ext[2-4]|ntfs)$" {

et j ' envoie le code avec la derniere modif awk .

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

Hors ligne

#264 Le 23/04/2025, à 08:30

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour,



J’ai (enfin) pris le temps de faire des tests (avec un disque externe, c’est mieux que rien) et j’ai débusqué quelques bugs.

D’abord, lors de la réécriture du script sur 80 colonnes (c’est à dire en limitant les lignes à 80 caractères maximum), j’ai fait une petite erreur dans l’écriture du fstab. Ce qui a eu pour conséquence que le montage ne pouvait pas se faire. Or le script m’annonçait fièrement s’être terminé avec succès, ce qui est faux.
J’ai donc décidé de supprimer toutes les redirections d’erreur vers /dev/null et de mettre les commandes en mode plus ou moins verbeux (c’est bien d’être informé de ce qu’il se passe) sous certaines conditions ainsi que de sortir en cas d’erreur de montage :

…
      if ! [ -d /media/"$Label" ]; then
        mkdir -v /media/"$Label"
      fi
      systemctl daemon-reload
      if ! mount -a; then
        exit 5
      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 10
      fi
…

 
Puis, suite à cette erreur, j’avais une entrée dans le fstab mais une partition non montée. Alors le script ne supprime pas la ligne dans le fstab.
J’ai donc ajouté une condition plus quelques lignes dans la fonction unmount :

…
unmount() {
…
  local mp="$(grep $Label /etc/fstab | cut -d ' ' -f 2)"
…
        PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
        if ! [ -z "$PartMountPoints" ]; 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
            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 ! [ -z "$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.
…
}
…

 
Ensuite, pour tester l’existence d’un label, il faut le vérifier pour toutes les partitions et non seulement celles listées préalablement.
Le test dans la fonction label devient alors :

…
  if lsblk -no label | grep -q "$Label"; then
    echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
    exit 4
  fi
…

À ce propos, pour tester ceci, j’ai mis une étiquette sur ma partition fat32 /boot/efi puis j’ai essayé de mettre la même étiquette sur la partition ext4 de mon disque. Eh bien e2label (je n’ai pas pu tester ntslabel) s’est exécuté sans broncher et j’ai donc eu deux partitions avec le même label.
Ce qui m’amène à penser que l’identification par le label dans le fstab n’est pas fiable à 100% et qu’il vaut mieux utiliser les UUID.
Ce script perd alors de son intérêt. hmm




Néanmoins, voici le script au complet avec mes corrections :

#!/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.
# ----------------------------------------------------------------------------

label() {
  local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"

  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
  done
  if lsblk -no label | grep -q "$Label"; then
    echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
    exit 4
  fi
}

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

  while [ -z "$rep3" ]; 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] " Rep3
    case "$Rep3" in
      N|n)
        echo "Annulation par l’utilisateur !"
        unset Rep3
        exit 0
      ;;
      Y|y|O|o|"")
        PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
        if ! [ -z "$PartMountPoints" ]; 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
            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 ! [ -z "$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.
        unset Rep3
        break
      ;;
      *)
        unset Rep3
      ;;
    esac
 done
}

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

$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" } 
$2 ~ "^(ext[2-4]|ntfs)$" {
  if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
    next  
  }
  else if ($3 ~ "^/") {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]="$3"\nListPart["i",3]="$4
  }
  else {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]=\nListPart["i",3]="$3
  }
}')

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

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

echo
echo "n° ⇒  path   label   fstype   mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
  echo "$((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
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 [ -z "$Rep" ]; do
    read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
    case "$Rep" in
      N|n)
        Label="$PartLabel"
        unset Rep
        break
      ;;
      Y|y|O|o|"")
        label
        unset Rep
        break
      ;;
      *)
        unset Rep
      ;;
    esac
  done
fi

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

  case "$Rep2" in
    N|n)
      echo "Annulation par l’utilisateur !"
      unset Rep2
      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 5
      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 10
      fi
      unset Rep2
      break
    ;;
    *)
      unset Rep2
    ;;
  esac
done

 



Et, pour le fun, sa version en 80 colonnes (je ne sais pas si c’est plus lisible mais je la préfère) :

#!/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
# ----------------------------------------------------------------------------

label() {
  local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  rgx+="0123456789_-]"

  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
    fi
  done
  if lsblk -no label | grep -q "$Label"
  then
    echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
    exit 3
  fi
}

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

  while [ -z "$rep3" ]
  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 Rep3
    case "$Rep3" in
      N|n)
        echo "Annulation par l’utilisateur !"
        unset Rep3
        exit 0
      ;;
      Y|y|O|o|"")
        PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
        if ! [ -z "$PartMountPoints" ]
        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
            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 ! [ -z "$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
        # Prise en compte du montage par le dash,
        # sans délai, parfois la partition ne s’affiche pas.
        sleep 1
        unset Rep3
        break
      ;;
      *)
        unset Rep3
      ;;
    esac
 done
}

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

$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" } 
$2 ~ "^(ext[2-4]|ntfs)$" {
  if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
    next  
  }
  else if ($3 ~ "^/") {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]="$3"\nListPart["i",3]="$4
  }
  else {
    print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
    print "ListPart["i",2]=\nListPart["i",3]="$3
  }
}')

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
  echo -n "$((n+1)) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,3]}"
  echo "   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
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 [ -z "$Rep" ]
  do
    echo -n "Voulez-vous changer l’étiquette "
    echo -n "de la partition « $Part » ? [O/n] "
    read -r Rep
    case "$Rep" in
      N|n)
        Label="$PartLabel"
        unset Rep
        break
      ;;
      Y|y|O|o|"")
        label
        unset Rep
        break
      ;;
      *)
        unset Rep
      ;;
    esac
  done
fi

while [ -z "$Rep2" ]
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 Rep2

  case "$Rep2" in
    N|n)
      echo "Annulation par l’utilisateur !"
      unset Rep2
      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 " >> /etc/fstab
        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," >> /etc/fstab
        echo -n "nofail,x-systemd.device-timeout=1,x-gvfs-show," >> /etc/fstab
        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 4
      fi

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

      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 5
      fi
      unset Rep2
      break
    ;;
    *)
      unset Rep2
    ;;
  esac
done

(Pour faire plaisir à RaphaelG, j’ai enlevé les points-virgules dans les if/while/for.)
(J’ai aussi revu la numérotation des exit.)

En ligne

#265 Le 23/04/2025, à 10:00

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

cette regex en deux temps m'agace, d'autant plus que je n'ai pas de problème à utiliser

rgx='[^[:alnum:]_-]'
[[ $Label =~ $rgx || ${#Label} -gt 16 ]] && echo "Label has space or is too long"

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

En ligne

#266 Le 23/04/2025, à 10:22

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

[:alnum:] comprend aussi les signes diacritiques. Or il ne faut pas les inclure.
D’où cette regex à rallonge d’iznobe.

En ligne

#267 Le 23/04/2025, à 10:37

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

y a-t-il des filtres sur des sorties de commandes en français ?
sinon, on peut ajouter un export LC_ALL=C au début du script.
non ?


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

En ligne

#268 Le 23/04/2025, à 10:41

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :

  LANG=C local rgx="[^[:alnum:]_-]"

En ligne

#269 Le 23/04/2025, à 10:44

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Messages croisés.

Watael a écrit :

y a-t-il des filtres sur des sorties de commandes en français ?

Je ne crois pas. Donc,

Watael a écrit :

sinon, on peut ajouter un export LC_ALL=C au début du script.
non ?

C’est une possibilité, effectivement.

En ligne

#270 Le 23/04/2025, à 11:00

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :

  LANG=C local rgx="[^[:alnum:]_-]"

Ça fonctionne.


nany a écrit :

Messages croisés.

Watael a écrit :

y a-t-il des filtres sur des sorties de commandes en français ?

Je ne crois pas. Donc,

Watael a écrit :

sinon, on peut ajouter un export LC_ALL=C au début du script.
non ?

C’est une possibilité, effectivement.

En fait, il y a des commandes qui donnent leur retour en anglais.



Je privilégierais donc la première solution.

En ligne

#271 Le 23/04/2025, à 11:02

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :

  LANG=C local rgx="[^[:alnum:]_-]"

hmm, pas convaincu après quelques tests : le problème ne vient pas de la définition de la regex, mais du moment de la comparaison (=~).


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

En ligne

#272 Le 23/04/2025, à 11:06

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

En fait, il y a des commandes qui donnent leur retour en anglais.

est-ce que les filtres doivent être modifiés, et est-ce que ça perturbe l'affichage pour l'utilisateur ?


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

En ligne

#273 Le 23/04/2025, à 11:13

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Watael a écrit :
nany a écrit :

En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :

  LANG=C local rgx="[^[:alnum:]_-]"

hmm, pas convaincu après quelques tests : le problème ne vient pas de la définition de la regex, mais du moment de la comparaison (=~).

J’ai pourtant testé avec succès.




Watael a écrit :

En fait, il y a des commandes qui donnent leur retour en anglais.

est-ce que les filtres doivent être modifiés,

A priori, non.

Watael a écrit :

et est-ce que ça perturbe l'affichage pour l'utilisateur ?

Bah, il y a du mélange de français et d’anglais. Je ne trouve pas ça terrible.

Dernière modification par nany (Le 23/04/2025, à 11:13)

En ligne

#274 Le 23/04/2025, à 11:54

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

bizarre. l'export devrait tout mettre en anglais.
lesquelles restent en français ?


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

En ligne

#275 Le 23/04/2025, à 11:59

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

En fait, c’est les echo "texte" où le texte est en français dans le code du script.
D’où le fait que je préférerais avoir des retours de commandes en français aussi.

En ligne