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.

#326 Hier à 10:33

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Salut watael , voici :

iznobe@k-pi3:~ $ mapfile -t labels < <(lsblk -no label)
for i in ${!labels[@]}; do echo "$i - ${labels[i]}"; done
0 - 
1 - bootfs
2 - rootfs
3 - mpoil
4 - 
iznobe@k-pi3:~ $

Donc il faudrait mettre :

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

?
quand meme , c' est pas tres intuitif cette histoire roll
je testerai mieux en rentrant chez moi . le principal etant que cela fonctionne , mais une idée de pourquoi ? :

"${!labels[@]}"

alors que pour les autres tableaux ce n' est pas necessaire , C' est lié à la sortie de la commande lsblk ?

Dernière modification par iznobe (Hier à 10:44)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#327 Hier à 12:39

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Suite aux indications de @Watael , et la prise en charge de points de montages multiples dans le fstab , voici le dernier script :

#!/bin/bash

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

LC_ALL=C

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

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

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

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

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

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

i=-1


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

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

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

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

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

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

#umount -v /media/"$PartLabel"

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

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

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

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

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

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

retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#328 Hier à 13:18

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

je n'ai pas dit de l'intégrer au code, je t'ai demandé de nous faire voir le résultat.

il apparaît, comme on le savait déjà (et puis on a oublié wink ), que certaines partitions n'ont pas de LABEL.
si on ne peut donc pas se fier à ${label[0]} pour tester que le tableau comporte des éléments, on doit se rabattre à tester le nombre des éléments du tableau; encore que, comme je te l'ai dit, on peut se passer du test en définissant nullglob.
Cependant, la boucle for va potentiellement itérer sur des éléments vides ! ...

[ajout]
Mais, la liste des labels existe déjà !

for i in ${!ListPart[*]}; do if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi; done

d'ailleurs, nany a numéroté les "champs", mais ce n'est pas obligatoire, on aurait pu avoir des noms de "champs" plus explicites :

            ((++i))
            ListPart[$i,path]="${lsblkDT[0]}"
            ListPart[$i,mPoint]="${lsblkDT[1]}"
            if [[ ${lsblkDT[2]} =~ ^/ ]]; then
                ListPart[$i,fsType]="${lsblkDT[2]}"
                ListPart[$i,label]="${lsblkDT[3]}"
#...

la boucle du dessus deviendrait :

for i in ${!ListPart[*]}; do if [[ $i == *,label && ${ListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi;done

edit: correction lListPart -> ListPart

Dernière modification par Watael (Hier à 13:58)


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

En ligne

#329 Hier à 13:37

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Watael a écrit :

[ajout]
Mais, la liste des labels existe déjà !

for i in ${!ListPart[*]}; do if [[ $i == *,3 && ${lListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi;done

la boucle du dessus deviendrait :

for i in ${!ListPart[*]}; do if [[ $i == *,label && ${lListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi;done

marche pas roll  :

for i in ${!ListPart[*]}; do
      if [[ $i == *,label && ${lListPart[$i]} == "$newLabel" ]]; then
        echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
      fi
    done
    # mapfile -t labels < <(lsblk -no label)
    # for i in "${!labels[@]}"; do
    #   if [[ "${labels[i]}" == "$newLabel" ]]; then
    #     echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
    #     unset newLabel
    #     break
    #   fi
    # done

done :

Choisissez le numéro correspondant à votre future partition de données : 16
La partition « /dev/nvme0n1p12 » a l’étiquette « test ».
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 : test
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « test » ? [O/n]

Dernière modification par iznobe (Hier à 13:47)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#330 Hier à 13:56

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

ceci marche à priori :

for i in ${!ListPart[*]}; do
      if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
        echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
        unset newLabel
        break
      fi
    done

un " l " en trop dans :

${lListPart[$i]}

Dernière modification par iznobe (Hier à 13:57)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#331 Hier à 13:56

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

pour que ça ([[ $i == *,label) fonctionne, il faut avoir fait ça

            ((++i))
            ListPart[$i,path]="${lsblkDT[0]}"
            ListPart[$i,mPoint]="${lsblkDT[1]}"
            if [[ ${lsblkDT[2]} =~ ^/ ]]; then
                ListPart[$i,fsType]="${lsblkDT[2]}"
                ListPart[$i,label]="${lsblkDT[3]}"
#...

pour toutes les affectations de ListPart (d'où le #...).

et puis il y a une coquille ici : ${lListPart
je corrige.


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

En ligne

#332 Hier à 14:01

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

j ' avais bien compris , mais comme la premiere boucle ne marchait pas , je me suis disque j' allais tester avec la 2eme ...
et ca ne marchait pas plus tongue

oui , j ' ai vu pour la coquille .

bon , je renvoie le code dans le github c ' est bon pour toi ? je modifie dans le 1er post .


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#333 Hier à 14:06

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

sinon , on peut utiliser le " . " normalement pour les étiquettes non ? car il n' est pas compris dans la regex .


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#334 Hier à 14:17

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

heu, non. d'après la regex [^[:alnum:]_-], le point n'est pas un caractère valide.


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

En ligne

#335 Hier à 14:22

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

oui , c' est ce que je dis .

Mais je ne trouve pas sur le net , un document de référence qui donne les caractères que l ' on peut utiliser sans risque pour mettre dans un " label " hmm
peut être que le " . " est valide et qu ' on devrait l ' inclure dans la regex .

Dernière modification par iznobe (Hier à 14:26)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#336 Hier à 16:01

tycooon

Re : [ SCRIPT ] pour montage automatique partitions internes

oups !! ça fonctionne, mais beaucoup d'erreur au montage avec mon environnement avec nautilus.

$ sudo ./montage
[sudo] Mot de passe de olivier : 

 n° ⇒    path    label   fstype   mountpoint
--------------------------------------------
 1  ⇒ /dev/sda1   backup   ext4   /media/olivier/backup
 2  ⇒ /dev/sdb3   sauvegarde   ntfs   /media/sauvegarde
 3  ⇒ /dev/nvme0n1p2      ntfs   
 4  ⇒ /dev/nvme0n1p3      ntfs   

Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sdb3 » a l’étiquette « sauvegarde ».
Voulez-vous changer l’étiquette de la partition « /dev/sdb3 » ? [O/n] n
Voulez-vous procéder au montage maintenant pour la partition « /dev/sdb3 » en y mettant pour étiquette « sauvegarde » ? [O/n] o
L’étiquette « sauvegarde » est déjà utilisée dans le fstab !
Voulez-vous démonter la partition « /dev/sdb3 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « sauvegarde » ? [O/n] o
umount: /media/sauvegarde (/dev/sdb3) démonté
rmdir: suppression du répertoire, '/media/sauvegarde'
mkdir: création du répertoire '/media/sauvegarde'

-----------------------------------------------------------------
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/sauvegarde/olivier-sauvegarde ».

** (org.gnome.Nautilus:37600): WARNING **: 15:52:27.397: 
========================================================
Cette application ne peut pas fonctionner correctement
si exécutée en tant que racine (pas même avec sudo). 
Envisagez d’exécuter `nautilus admin:/` à la place.
========================================================
** Message: 15:52:34.420: Connecting to org.freedesktop.Tracker3.Miner.Files
Initializing nautilus-image-converter extension

(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.620: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.620: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.620: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): libunity-CRITICAL **: 15:52:34.627: file unity-launcher.c: line 1638: unexpected error: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom) (g-exec-error-quark, 8)

(org.gnome.Nautilus:37600): libunity-CRITICAL **: 15:52:34.627: unity_launcher_entry_dbus_impl_construct: assertion 'conn != NULL' failed

(org.gnome.Nautilus:37600): libunity-CRITICAL **: 15:52:34.631: unity-inspector.vala:96: Unable to connect to session bus: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): Gtk-WARNING **: 15:52:34.636: Unable to acquire session bus: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.702: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.702: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): GLib-GIO-CRITICAL **: 15:52:34.742: g_dbus_proxy_call_internal: assertion 'G_IS_DBUS_PROXY (proxy)' failed

(org.gnome.Nautilus:37600): GLib-GIO-CRITICAL **: 15:52:34.742: g_dbus_proxy_get_connection: assertion 'G_IS_DBUS_PROXY (proxy)' failed

(org.gnome.Nautilus:37600): GLib-GIO-CRITICAL **: 15:52:34.742: g_dbus_connection_signal_subscribe: assertion 'G_IS_DBUS_CONNECTION (connection)' failed

** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Error creating proxy L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Error creating proxy L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Error creating proxy L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Unable to create connection for session-wide Tracker indexer: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.756: Unable to get contents of the bookmarks file: Erreur lors de l’ouverture du fichier /root/.gtk-bookmarks : Aucun fichier ou dossier de ce nom

** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.757: Unable to get contents of the bookmarks file: Erreur lors de l’ouverture du fichier /root/.gtk-bookmarks : Aucun fichier ou dossier de ce nom

(org.gnome.Nautilus:37600): nautilus-application-CRITICAL **: 15:52:34.823: update_dbus_opened_locations: assertion 'dbus_object_path' failed

(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.823: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:48.172: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)

il ne doit pas aimer cette ligne ????

 xdg-open "/media/$newLabel/$SUDO_USER-$newLabel"

Hors ligne

#337 Hier à 16:25

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Salut @tycooon , il n ' y a que cela comme erreurs ? tongue

bon , je supprime la ligne .


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#338 Hier à 16:37

tycooon

Re : [ SCRIPT ] pour montage automatique partitions internes

bon j'ai trouvé le problème c'est le sudo

sudo xdg-open "/media/sauvegarde/olivier-sauvegarde"
[sudo] Mot de passe de olivier : 

** (org.gnome.Nautilus:40453): WARNING **: 16:33:47.221: 
========================================================
Cette application ne peut pas fonctionner correctement
si exécutée en tant que racine (pas même avec sudo). 
Envisagez d’exécuter `nautilus admin:/` à la place.
========================================================

sans le sudo ça fonctionne

xdg-open "/media/sauvegarde/olivier-sauvegarde"

Mais comme le script est lancé avec le sudo, j'ai les messages d'erreur

Hors ligne

#339 Hier à 17:12

tycooon

Re : [ SCRIPT ] pour montage automatique partitions internes

si tu tiens vraiment à ouvrir l'interface graphique, ceci fonctionne sans erreur

sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1 &

Bon Ok, j'ai pas trouvé tout seul tongue tongue

Hors ligne

#340 Hier à 17:26

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

je suis pas sur que l' esperluette à la fin de la commande soit nécessaire .

je trouvais que ça faisait quand même plus classe d ' ouvrir le dossier en question à la fin , du coup j ' ajoute la nouvelle ligne , sans le dernier " & " .

Merci wink

Dernière modification par iznobe (Hier à 17:31)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#341 Hier à 17:44

erresse

Re : [ SCRIPT ] pour montage automatique partitions internes

Hello,
Autant que je sache, la variable "$SUDO_USER" est utile pour connaître le nom de l'utilisateur qui exécute le script lorsque ce dernier est lancé avec "sudo". Sans cela, la variable "$USER" renvoie "root" et non l'utilisateur.
Donc, si le script de iznobe est bien exécuté avec "sudo" au lancement, il est indispensable d'utiliser "$SUDO_USER" pour pouvoir identifier correctement l'utilisateur.


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#342 Hier à 17:54

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

suppression de unmount() : une fonction est vraiment utile pour du code qui se répète

# traitement des partitions montées
mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
delMountPoint mountedParts
# traitement des partitions NON montées
mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoint unmountedParts 
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

avec delMountPoint telle que :

delMountPoint()
{
    local rgx="^(/mnt/|/media/).+$"
    declare -na parts=$1
    for part in "${parts[@]}"
    do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]
        then
            if [[ $part =~ $rgx ]]
            then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"
        do
            sed -i "${n}d" /etc/fstab              
        done
    done
}

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

En ligne

#343 Hier à 18:10

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

ok , une fonction a un paramètre .

bon là , j' en ai un peu ras le bol ... , mais c' était ma future question de toute manière , tu m' as devancé big_smile


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#344 Aujourd'hui à 05:13

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

j'ai mis "un peu" le nez dans l'ensemble du script. Ça ne me paraît pas très cohérent :
on définit des variables
on choisit une partition
on définit un nouveau label
jusque là, ça va
et puis ça devient chaotique :
on demande si on veut monter la partition, alors qu'on ne sait pas si elle est démontée
puis si on veut démonter la partition, alors qu'on ne sait pas si elle est montée
on remonte toutes les partitions
et après, j'ai les yeux qui brûlent : trop de ; et de "

à cette heure, j'en suis là :

#!/bin/bash

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

LC_ALL=C
shopt -s nullglob

choixLabel() {
    while [ -z "$newLabel" ]
    do    
        echo "L’étiquette (LABEL) de votre partition de données doit être UNIQUE"
        echo "ne pas contenir ni espace, ni accent, ni caractères spéciaux"
        echo "et doit comporter 16 caractères macimum."

        read -rp 'Quel nom souhaitez-vous donner à votre partition ? '
        if [[ $REPLY =~ ${Rgx[label]} ]]
        then
            echo "Votre étiquette comporte
            * une espace, ou
            * un accent, ou
            * un caractère spécial."
            continue
        elif (( ${#REPLY} > 16 ))
        then
            echo "Votre étiquette comporte plus de 16 caractères."
            continue
        else
            for i in ${!ListPart[*]}; do
                if [[ $i == *,label && ${ListPart[$i]} == $REPLY ]]; then
                    echo "Erreur: le nom « $REPLY » est déjà attribué ! Choisissez-en une autre."
                    continue 2
                fi
            done
        fi
        newLabel=$REPLY
    done
}
delMountPoint()
{
    declare -na mountPoints
    for mountPoint in "${mountPoints[@]}"
    do
        if test "$1" = 'mountedPoints'; then umount -v "$mountPoint"; fi
        if [ -d "$mountPoint" ]
        then
            if [[ $mountPoint =~ ${Rgx[unmount]} ]]; then
                rmdir -v "$mountPoint"
            else
                echo "$mountPoint a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$mountPoint" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"; do
            sed -i "${n}d" /etc/fstab
        done
    done
}

# définition de variables
declare -i i=-1 nbDev partNum
declare -A Rgx=(
    [fstype]="^(ext[2-4]|ntfs)"
    [label]="[^[:alnum:]_-.]"
    [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"
    [unmount]="^(/mnt/|/media/).+$"
)
declare -A ListPart
while read -ra lsblkDT
do
    if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]
    then
        if ! [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]
        then
            ((++i , ++nbDev))
            ListPart[$i,path]="${lsblkDT[0]}"
            ListPart[$i,fstype]="${lsblkDT[1]}"
            if [[ ${lsblkDT[2]} =~ ^/ ]]; then
                ListPart[$i,mountpoint]="${lsblkDT[2]}"
                ListPart[$i,label]="${lsblkDT[3]}"
            else
                ListPart[$i,mountpoint]=""
                ListPart[$i,label]="${lsblkDT[2]}"
            fi
        fi
    fi
done < <(lsblk -no path,fstype,mountpoint,label --filter 'path !~ ".*/sd[[:alpha:]]$"') #pour pas voir les disques.
if ((nbDev)); then
    echo "Il n’y a pas de partition susceptible d’être montée."
    exit 2
fi
# Sélection de la partition à traiter
# affichage des partitions
echo
echo " n° :    path    label   fstype   mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
    printf '%2d : %s %s %s %s\n' $((n+1)) "${ListPart[$n,path]}" "${ListPart[$n,label]}" "${ListPart[$n,fstype]}" "${ListPart[$n,mountpoint]}"
done
echo
# sélection d'une partition
while (( 0 >= partNum || partNum > nbDev ))
do
    ((err)) && echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
    read -rp "Chosissez le numéro correspondant à votre future partition de données : " partNum
    err=1
done
partNum-=1
Part="${ListPart[$partNum,path]}"
PartLabel="${ListPart[$partNum,label]}"
PartFstype="${ListPart[$partNum,fstype]}"

# définition d'un nouveau LABEL
if [ -z "$PartLabel" ]
then
    echo "La partition « $Part » n’a pas d’étiquette."
    choixLabel
else
    echo "La partition « $Part » a l’étiquette « $PartLabel »."
    while :
    do
        read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [o|N] " #par défaut, si l'utilisateur ne répond pas explicitement "oui", on ne change rien.
        if [[ $REPLY == [YyOo] ]]
        then
           choixLabel
        else
           newLabel="$PartLabel"
        fi
        break
    done
fi

# Avertissements
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab
then
    echo "L’UUID de la partition est déjà présent dans le fstab !"
    echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
fi
if grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab
then
    echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
    echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
fi
if grep -q "^$Part" /etc/mtab
then
    echo "La partition « $Part » est déjà montée !"
    echo "la partition sera démontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
fi

#SOUHAITEZ-VOUS POURSUIVRE ?
#...

#VOUS ÊTES SÛR DE VOULOIR EFFECTUER LES MODIFICATIONS ?
#VOUS NE POURREZ PAS EFFACER LES MODIFICATIONS. automatiquement
#...

#
# à partir de là, toutes les demandes de confirmation peuvent être supprimées.
#

# démontage
# traitement des partitions montées #Vérifier qu'elle est montée
mapfile -t mountedPoints < <(grep "^$Part" /etc/mtab | cut -d " " -f 2)
delMountPoint mountedPoints

# traitement des partitions NON montées #Vérifier qu'elle est dans fstab
mapfile -t notMountedPoints < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoints notMountedPoints
sed -i"$(date +'_%F_%T.%N')" "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

# mise à jour de fstab
if [[ $PartFstype =~ ext[2-4] ]]
then
    labelizer=$(which e2label)
    add2fstab="LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1"
elif [ "$PartFstype" == "ntfs" ]; then
    labelizer=$(which ntfslabel)
    add2fstab="LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID"
fi
$labelizer "$Part" "$newLabel"
cp /etc/fstab{,$(date +'_%F_%T.%N')}
echo "$add2fstab" >>/etc/fstab

# construction des éléments ?
if ! [ -d "/media/$newLabel" ]
then
    mkdir -v "/media/$newLabel"
fi
#remontage des partitions inscrites dans dstab
systemctl daemon-reload
if ! mount -a
then
    echo "erreur innatendue , annulation des modifications !"
    rmdir -v "/media/$newLabel"
    exit 3
fi

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

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

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

Dernière modification par Watael (Aujourd'hui à 06:18)


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

En ligne

#345 Aujourd'hui à 05:57

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

heu , j ' ai l ' impression que le petit poucet a perdu ses miettes de pains .

l ' objectif du script : on choisit une partition que l' on va montée avec un LABEL précis quoi qu ' il arrive .

le déroulement du script c' est plutôt ( tout simplement ) :
on liste l ' ensemble des partitions modifiables et on en recueille les données .
on demande à l' utilisateur de choisir laquelle il veut traiter
on demande à l' utilisateur quel label il veut y mettre
on demande à l' utilisateur confirmation que les données entrées sont celles qu ' il veut avant de traiter
on traite ( et on avertit le cas échéant de ce qu ' il peut se passer lors du script en fonction de l' état du fstab , des montages en places , et je sais plus tant quoi d' autre ) .


je ne sais pas ou tu as vu :

on demande si on veut monter la partition, alors qu'on ne sait pas si elle est démontée
puis si on veut démonter la partition, alors qu'on ne sait pas si elle est montée
on remonte toutes les partitions

Dernière modification par iznobe (Aujourd'hui à 06:01)


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#346 Aujourd'hui à 06:23

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

ta fonction unmount le masque.
remplace l'appel de la fonction par son code, tu le verras aussi.


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

En ligne

#347 Aujourd'hui à 06:31

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

oui , je suis d' accord avec toi sur ce point , d ' ou la question que tu m' as devancé .

il faut preciser , que jusqu ' a il y a peu , à la palce de :

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

  case "$REPLY" in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
      fi
      unmount

      # construction des éléments :
...

je faisais :

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

  case "$REPLY" in
    N|n)
      echo "Annulation par l’utilisateur !"
      exit 0
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
unmount
      elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
        echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
        echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
unmount
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
unmount
      fi

      # construction des éléments :
...

Mais ca ne traitait pas dans tous les cas a priori .


retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne

#348 Aujourd'hui à 06:32

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

ça aussi ça va pas :

sed -i"$(date +'_%F_%T.%N')" "/$(lsblk -no uuid "$Part")/d" /etc/fstab

puisque tu réécris la table des partitions avec des LABEL, et pas des UUID, la prochaine fois /etc/fstab ne sera pas mis à jour.

Dernière modification par Watael (Aujourd'hui à 06:32)


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

En ligne

#349 Aujourd'hui à 06:41

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

comme je l'ai écrit dans le script, il y a trop de confirmations et d'exécutions partielles.
il vaut mieux deux confirmations successives (la seconde étant plus "impérieuse"), et faire tout ce qu'il y a à faire d'une traite.
donc,

  • recueil des informations (état et modifications souhaitées)

  • affichage de l'état avant

  • affichage de l'état prévu

  • confirmation

  • CONFIRMATION

  • exécution

  • affichage de l'état après

et pour pouvoir revenir en arrière (au moins manuellement), il faut garder autant de traces que possible de l'état de la machine (sauvegarder mtab) et des fichiers qui seront modifiés (sauvegarder fstab), avant chaque modification.

Dernière modification par Watael (Aujourd'hui à 06:48)


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

En ligne

#350 Aujourd'hui à 07:25

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Watael a écrit :

suppression de unmount() : une fonction est vraiment utile pour du code qui se répète

# traitement des partitions montées
mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
delMountPoint mountedParts
# traitement des partitions NON montées
mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoint unmountedParts 
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.

avec delMountPoint telle que :

delMountPoint()
{
    local rgx="^(/mnt/|/media/).+$"
    declare -na parts=$1
    for part in "${parts[@]}"
    do
        if test "$1" = 'mountedParts'; then umount -v "$part"; fi
        if [ -d "$part" ]
        then
            if [[ $part =~ $rgx ]]
            then
                rmdir -v "$part"
            else
                echo "$part a été conservé."
            fi
        fi
        mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
        for n in "${numLines[@]}"
        do
            sed -i "${n}d" /etc/fstab              
        done
    done
}

sur le papier la fonction delMountPoint avait l' air sympa , mais :

Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « tes » ? [O/n] 
L’étiquette « tes » est déjà utilisée dans le fstab !
les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez
sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications
automount_part_data.sh: line 34: declare: parts: reference variable cannot be an array
automount_part_data.sh: line 34: declare: parts: reference variable cannot be an array
Cannot make changes to a mounted device
mkdir: création du répertoire '/media/tes'
mkdir: création du répertoire '/media/tes/iznobe-tes'
appartenance de '/media/tes/iznobe-tes' modifiée de root:root en iznobe:iznobe
mkdir: création du répertoire '/media/tes/.Trash-1000'
appartenance de '/media/tes/.Trash-1000' modifiée de root:root en iznobe:iznobe
le mode de '/media/tes/.Trash-1000' a été modifié de 0755 (rwxr-xr-x) en 0700 (rwx------)

-----------------------------------------------------------------
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/tes/iznobe-tes ».
iznobe@iznobe-pc:~/Scripts$

retour COMPLET et utilisable de commande  |  script montage partitions

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

Hors ligne