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.

#276 Hier à 12:13

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

D’ailleurs, l’export impacte la session en cours au lieu de ne modifier que pour le script.

En ligne

#277 Hier à 12:15

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

On en revient donc .
Chez moi, la première solution fonctionne.

En ligne

#278 Hier à 12:20

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

si on n'exporte pas la locale (on se contente de la définir : LC_ALL=C), alors les commandes externes n'en héritent pas, et seul l'environnement du script s'y conforme.


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

En ligne

#279 Hier à 12:21

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

D’ailleurs, l’export impacte la session en cours au lieu de ne modifier que pour le script.

ça, ce n'est pas possible, à moins de sourcer le script.

Dernière modification par Watael (Hier à 12:21)


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

En ligne

#280 Hier à 12:42

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

En effet.

Je ne sais pas ce qu’il s’est passé chez moi mais ma locale était passée en anglais.


Ceci dit, LANG=C local rgx="[^[:alnum:]_-]" fonctionnant chez moi, je ne vois pas pas de raison de ne pas l’utiliser.

En ligne

#281 Hier à 13:01

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

parce que ça ne fonctionne pas chez moi. big_smile


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

En ligne

#282 Hier à 13:24

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Oui, et en fait ça ne fonctionnait que du fait du dérèglement de ma locale.

En ligne

#283 Hier à 14:12

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bon eh bien tant pis pour les retours en anglais:

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

export 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
  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 sur 80 colonnes:

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

export 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
    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

Dernière modification par nany (Hier à 14:37)

En ligne

#284 Hier à 14:17

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

Watael a écrit :

si on n'exporte pas la locale (on se contente de la définir : LC_ALL=C), alors les commandes externes n'en héritent pas, et seul l'environnement du script s'y conforme.

non ?

Dernière modification par Watael (Hier à 14:17)


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

En ligne

#285 Hier à 14:19

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Oui.
Je parle bien des retours de commandes dans le script.

En ligne

#286 Hier à 14:29

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

oui. sans export, les retours des commandes externes devraient rester en français.

#!/bin/bash

LC_ALL=C

maFonc () {
    rgx='[^[:alnum:]_-]'
    var='polémik'
    [[ $var =~ $rgx ]] && echo "err in Label"
}
set -x
maFonc
set +x
cp -v fichierNonExistant $0.bak
$ ./monScript
+ maFonc
+ rgx='[^[:alnum:]_-]'
+ var=$'pol\303\251mik'
+ [[ polémik =~ [^[:alnum:]_-] ]]
+ echo 'err in Label'
err in Label
+ set +x
cp: impossible d'évaluer 'fichierNonExistant': Aucun fichier ou dossier de ce nom
$ 

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

En ligne

#287 Hier à 14:36

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

OK, je testerai quand je serai de retour chez moi.

En ligne

#288 Hier à 17:29

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

je testerai quand je serai de retour chez moi.

Ça marche !
Donc, dernière mouture :

#!/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
  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
    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 2
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 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
      unset Rep2
      break
    ;;
    *)
      unset Rep2
    ;;
  esac
done

Et en version 80 colonnes :

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

 


À tester dans tous les sens.

En ligne

#289 Hier à 17:44

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

  •     if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]

    les guillemets sont inutiles entre [[ ]], et encore plus avec des nombres; et avec case aussi.

  • pour ne pas avoir à unset les différentes Rep, Rep2 et 3, on pourrait utiliser la variable par défaut ($REPLY), qui sera réinitialisée à chaque read

Dernière modification par Watael (Hier à 17:45)


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

En ligne

#290 Hier à 20:23

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Au vu des deux dernières remarques de Watael :

#!/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
  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 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|"")
        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.
        break
      ;;
      *)
      ;;
    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 2
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 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

Ou en 80 colonnes :

#!/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
    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 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|"")
        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
        break
      ;;
      *)
      ;;
    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 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 " >> /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
      break
    ;;
    *)
    ;;
  esac
done
nany a écrit :

À tester dans tous les sens.

Dernière modification par nany (Hier à 21:54)

En ligne

#291 Hier à 20:38

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour , oulaha la la ! vous vous êtes énervés wink

Cette semaine , je vais pas trop avoir le temps de regarder , ni de tester ...
Des que j' ai un peu de temps , je regarde ça de pres , car y a pas mal de choses a regarder , mais au final ca ne change que peu de choses si j' ai bien compris .


C' est beaucoup plus simple de gérer ça au cas par cas que d ' en faire un script cette histoire ...

Hors ligne

#292 Hier à 21:40

tycooon

Re : [ SCRIPT ] pour montage automatique partitions internes

bonjour
petite erreur (oubli)

line 92: ((: 16 = 0 : attempted assignment to non-variable (error token is "= 0 ")
if (( ${#ListPart[@]} == 0 )); then

piqué dans le script précédant

Hors ligne

#293 Hier à 21:56

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Oups !
Merci tycooon.

Corrigé dans le message #290.

En ligne

#294 Hier à 23:51

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bon, j’ai passé les deux versions dans ShellCheck.
Donc, après avoir suivi ses conseils :

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

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

declare -A ListPart
eval $(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 '$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+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 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

Ou (80 colonnes) :

#!/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
    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
  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 && $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
        # 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
eval $(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 '$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 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 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 -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
      break
    ;;
    *)
    ;;
  esac
done

(Ça ne va pas faire plaisir à Watael : y a un eval.)

[edit]Et je me rends compte seulement maintenant que j’avais laissé des redirections d’erreurs dans /dev/null.[/edit]

Dernière modification par nany (Aujourd'hui à 04:34)

En ligne

#295 Aujourd'hui à 08:49

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

eval qui  n'est pas indispensable, et qui est redondant avec la Substitution de commandes; ça marchait bien sans, non ?

et puis on n'en a pas besoin :

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

i=-1

while read -ra lsblkDT #path fstype mountP 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]=${lsbklDT[2]}
                ListPart[$i,3]=${lsblkDT[3]}
            else
                ListPart[$i,2]='' #en a-t-on vraiment besoin ?
                ListPart[$i,3]=${lsblkDT[2]}
            fi
        fi
    fi
done < <(lsblk -no path,fstype,mountpoint,label)

si je ne me suis pas trompé...

Dernière modification par Watael (Aujourd'hui à 09:03)


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

En ligne

#296 Aujourd'hui à 11:20

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Watael a écrit :

eval qui  n'est pas indispensable, et qui est redondant avec la Substitution de commandes; ça marchait bien sans, non ?

Oui, ça marchait sans mais,

ShellCheck a écrit :

SC2091 (warning): Remove surrounding $() to avoid executing output (or use eval if intentional).

Bon, j’ai juste lu use eval if intentional sans cliquer sur le lien. hmm

Watael a écrit :

et puis on n'en a pas besoin :

Je me doutais bien que tu trouverais autre chose. wink

Watael a écrit :

si je ne me suis pas trompé...

Presque. Je ne sais pas pourquoi mais le mountpoint n’était pas récupéré. Il a fallu quoter ${lsblkDT[3]} (ou ${lsblkDT[2]} selon le cas) alors du coup j’ai tout quoté (ShellCheck acceptant les deux cas) :

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)

(Ah oui, vfat est exclu de la recherche et on a vraiment besoin de la ligne ListPart[$i,2]="".)

En ligne

#297 Aujourd'hui à 11:31

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

ah! le vfat, c'est parce que j'ai fait les tests avec une simple clé USB; j'ai oublié de l'effacer à la copie.


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

En ligne

#298 Aujourd'hui à 11:37

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

        if ! [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]
        then
            ((++i))

...
pas besoin du continue : en shell on peut facilement "nier" un test, contrairement à awk.

Dernière modification par Watael (Aujourd'hui à 11:37)


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

En ligne

#299 Aujourd'hui à 11:44

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

OK.

Alors voici les dernières moutures :

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

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

En 80 colonnes :

#!/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
    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
  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 && $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
        # 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
  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 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 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 -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
      break
    ;;
    *)
    ;;
  esac
done

En ligne

#300 Aujourd'hui à 18:39

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour , ouarf , on ne vous arrête plus big_smile

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


Pourquoi inclure dans le case de la fonction " unmount " , un cas par défaut , qui ne fait rien ?
ha ba oui , y a eu d' autres modifs , et donc comme on ne traite que le cas oui et non , il faut ajouter le " reste " .


Ha , ya plus le AWK cool , mais bon , c' est toujours aussi simple sad

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)

Quoi que , en fait si ça va . Hors mis les " <  < " , qu' est ce que cella fait en français ?


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 ?

Dernière modification par iznobe (Aujourd'hui à 19:37)

Hors ligne