Contenu | Rechercher | Menus

Annonce

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

À propos de l'équipe du forum.

#251 Hier à 07:40

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

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

Quelle est la subtilité ?

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

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

Dernière modification par nany (Hier à 07:43)

Hors ligne

#252 Hier à 07:47

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

nany a écrit :

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

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

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

Hors ligne

#253 Hier à 07:51

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

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

Hors ligne

#254 Hier à 07:55

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

oui , j ' ai vu wink

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


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

Dernière modification par iznobe (Hier à 08:03)

Hors ligne

#255 Hier à 08:13

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

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

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

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

Dernière modification par iznobe (Hier à 08:19)

Hors ligne

#256 Hier à 08:27

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Non, ce n’est pas possible.


Voilà ce que j’ai fait pour corriger :

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

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

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

Dernière modification par nany (Hier à 08:31)

Hors ligne

#257 Hier à 08:33

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

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

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

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

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

Choisissez le numéro correspondant à votre future partition de données : 16
La partition « /dev/nvme0n1p12 » a l’étiquette « rety ».
Voulez-vous changer l’étiquette de la partition « /dev/nvme0n1p12 » ? [O/n] 
Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : yhft
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « yhft » ? [O/n] 
L’UUID de la partition est déjà présent dans le fstab !
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « yhft » ? [O/n] 
umount: /media/rety (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/rety'
umount: /mnt: la cible est active.
/mnt n’a pas été supprimé.
umount: /mnt/test démonté
rmdir: suppression du répertoire, '/mnt/test'
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !

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

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

Dernière modification par iznobe (Hier à 08:36)

Hors ligne

#258 Hier à 08:46

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

tester quoi si elle eslt listée ?

Non, ça c’est OK.

iznobe a écrit :

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

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


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

Hors ligne

#259 Hier à 09:06

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

avec le AWK de 4 champs 1er jet :

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

resultat :

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

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

Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sda2 » n’a pas d’étiquette.
Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : 

Hors ligne

#260 Hier à 09:09

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

avec le nouveau :

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

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

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

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

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

Hors ligne

#261 Hier à 09:17

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

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

Hors ligne

#262 Hier à 09:28

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

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

#!/bin/bash

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Hors ligne

#263 Hier à 09:32

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

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

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

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

Dernière modification par iznobe (Hier à 09:33)

Hors ligne