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.

#226 Le 17/04/2025, à 20:08

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

j ' envoie la sauce dans le 1er messageet le github .

La ligne 38 est toujours incorrecte.

nany a écrit :
iznobe a écrit :

j ' ai modifié un peu le script et integré le tableau donc .

…
         PartMountPoints="$(grep "$Part" /etc/mtab | cut -d " " -f 2)"
…
         PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )

En ligne

#227 Le 17/04/2025, à 20:18

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

arf , z ' avais pas vu big_smile

Bon et bien , ca fonctionne nickel tout ca avec ta derniere correction  @nany cool

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

Hors ligne

#228 Le 17/04/2025, à 20:45

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Juste une petite remarque : AMHA le répertoire /mnt ne devrait pas être supprimé (en même temps, le choisir comme point de montage dans le fstab n’est pas très judicieux).

Dernière modification par nany (Le 17/04/2025, à 20:45)

En ligne

#229 Le 18/04/2025, à 00:38

tycooon

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour,
Bon, je me lance en tant que testeur :

$ sudo ./montage
[sudo] Mot de passe de olivier : 
1 ⇒ /dev/sda1   backup   ext4
2 ⇒ /dev/sdb3   sauvegarde   ntfs
3 ⇒ /dev/nvme0n1p2      ntfs
4 ⇒ /dev/nvme0n1p3      ntfs
5 ⇒ /dev/nvme0n1p5      ext4
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
La partition « /dev/sdb3 » est déjà montée !
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: /mnt/usb-Samsung_PSSD_T7_S5TKNJ0T202749K-0:0-part3 (/dev/sdb3) démonté
rmdir: suppression du répertoire, '/mnt/usb-Samsung_PSSD_T7_S5TKNJ0T202749K-0:0-part3'
-----------------------------------------------------------------
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 ».

Première passe , tout fonctionne RAS smile

$ lsblk -fe7
NAME        FSTYPE FSVER LABEL      UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                                     
└─sda1      ext4   1.0   backup     7c9e2ffb-88e4-4c01-99fe-18538b4a50cc  340,2G    22% /media/olivier/backup
sdb                                                                                     
├─sdb1      exfat  1.0   Ventoy     A38B-994C                              54,4G    17% /media/olivier/Ventoy
├─sdb2      vfat   FAT16 VTOYEFI    223C-F3F8                                           
└─sdb3      ntfs         sauvegarde 2A8B81087147EA94                      399,9G     0% /media/sauvegarde
nvme0n1                                                                                 
├─nvme0n1p1                                                                             
├─nvme0n1p2 ntfs                    8EB48053B4804027                                    
├─nvme0n1p3 ntfs                    6A0E1D830E1D4989                                    
├─nvme0n1p4 vfat   FAT32            2DE7-61A9                             559,3M     7% /boot/efi
└─nvme0n1p5 ext4   1.0              b7458ee0-9d67-4c1e-9f95-c94fd4c2e8d6  555,6G    13% /

Hors ligne

#230 Le 18/04/2025, à 09:32

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Salut @tycoon .
le script est approprié pour des montages de partition de disque interne .
en NTFS , l ' option " nofail " est incorporé au fstab . mais bon , c' est pas l' ideal , car il n ' y  a pas de delai avec une option specifique qui , elle n' est pas incorporée dans les options .

d' ailleurs , il faudrait aussi modifier , les options de montage pour le format ext4 dans le cas de support externe .
il faut donc retravailler les options de montage dans le cas où il s' agit de partition externe .

En redémarrant et si ton disque externe n ' est pas connecté , que se passe t ' il ?




@nany , mon dossier /mnt n ' a pas été supprimé , vu qu ' il n' est pas vide .

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

Hors ligne

#231 Le 18/04/2025, à 10:27

tycooon

Re : [ SCRIPT ] pour montage automatique partitions internes

le disque enlevé , le boot se passe sans problème , juste un message d'erreur qui est normal, puisque le disque externe est absent, ce qui est sans conséquence sur le fonctionnement du PC.
Et le boot est aussi rapide avec ou sans disque.

$ journalctl --no-pager -b -p err
-------------------------------------------etc
avril 18 10:15:57 olivier-LarkBox-X systemd[1]: Timed out waiting for device dev-disk-by\x2dlabel-sauvegarde.device - /dev/disk/by-label/sauvegarde.

Hors ligne

#232 Le 18/04/2025, à 10:34

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

ok , merci pour l' info .

j ' ajusterai ce soir , en rentrant chez moi , les options de la ligne fstab poir les 2 formats , dans le cas de partition externe .

Hors ligne

#233 Le 18/04/2025, à 13:49

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

ajout des options au lignes de fstab : " ,nofail,x-systemd.device-timeout=1 "

Hors ligne

#234 Le 18/04/2025, à 16:51

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour,



Eh oui, j’avais eu le temps de voir le message #227 (ou iznobe décrivait un test avec une partition montée sur /mnt) avant qu’il ne soit édité. Donc,

iznobe a écrit :

@nany , mon dossier /mnt n ' a pas été supprimé , vu qu ' il n' est pas vide .

Certes, mais dans la majorité des cas il est vide. Ma remarque tiens toujours et j’ai poussé la réflexion un peu plus loin : il ne faudrait pas lister a minima les partitions éventuellement montées sur des points de montage proposés lors de l’installation avec partitionnement manuel (/, /boot, /home, /tmp, /usr, /var, /srv, /opt et /usr/local).
Je propose donc de remplacer les lignes 63 à 90 :

$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext|ntfs" \
{
j=0 ;
if ($2 ~ /^ext[2-4]$/ || $2 ~ /^ntfs$/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=""\nListPart["i","++j"]="$2 }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3 }
}')

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

for (( n=0; n<nbDev; n++ )); do
  echo "$(( n+1 )) ⇒ ${ListPart[$n,0]}   ${ListPart[$n,1]}   ${ListPart[$n,2]}"
done

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 )),1]}"
PartFstype="${ListPart[$(( PartNum-1 )),2]}"

par :

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

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]}"

(J’ai changé l’ordre dans lsblk pour faciliter les tests.)


J’ai testé cette partie de code.
Il faudrait tester son intégration dans le script notamment pour des points de montage multiples et et des répertoires « sensibles » comme points de montage.

En ligne

#235 Le 18/04/2025, à 17:30

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

ouarf , c' est ce que j' avais tenté de faire à un moment donné mais c' était un poil complexe ... trop pour moi .

je viens de tester rapidement , ca fonctionne .
il me semble cependant que tu as oublié un pipe dans la fin de ( entre usr et local ) :

nany a écrit :
if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/)


Par contre , pour le " rmdir " , il faut que je reconstruise la même regex , c' est un peu dommage ...
on ne pourrait pas définir cette regex en dehors du lsblk ( ou bien la recuperer , si c' est possible ? ) pour s ' en rerservir ensuite ?
il va falloir faire quelquechose dans le genre de :

$rgx_no_rmdir=^/$|^/boot$|^/home|^/tmp|^/usr$|^/var$|^/srv$|^/opt$|^/usr/|local$/
if ! $pmp =~ $rgx_no_rmdir
  rmdir -v "$pmp"

code ci dessus non testé , ecrit ça là direct ...

Dernière modification par iznobe (Le 18/04/2025, à 17:40)

Hors ligne

#236 Le 18/04/2025, à 17:38

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

il me semble cependant que tu as oublié un pipe dans la fin de ( entre usr et local ) :

nany a écrit :
if ($3 ~ /^\/$|^\/boot$|^\/home$|^\/tmp$|^\/usr$|^\/var$|^\/srv$|^\/opt$|^\/usr\/local$/)

Non, non, c’est bien /usr/local qui doit être recherché.

En ligne

#237 Le 18/04/2025, à 17:51

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$' '...if ($3 ~ nomVar)...

?


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

Hors ligne

#238 Le 18/04/2025, à 18:09

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

@nany , autant pour moi roll


@watael , je teste ça .

Hors ligne

#239 Le 18/04/2025, à 18:17

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Watael a écrit :
gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$' '...if ($3 ~ nomVar)...

?


rooo la boulette de  debutant tongue manque le " $ " tongue

if ($3 ~ $nomVar)

loool , merci @watael big_smile

voilà ce que ça donne :

#!/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,1]}" ]]; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
      exit 4
    fi
  done
}

unmount() {
  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 !"
        exit 1
      ;;
      Y|y|O|o|"")
        PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
        for pmp in "${PartMountPoints[@]}"; do
          umount -v "$pmp"
          if ! [[ "$pmp" =~ $nomVar ]]; then
            rmdir -v "$pmp"
          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 delai , 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 0
fi

gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'

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

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 1
    ;;
    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

j ' approfondi les tests .

part nvme0n1p12 montée sur mount et un autre via le script :

mount: /media/yiiut (/dev/nvme0n1p12) démonté
umount: /mnt démonté
-----------------------------------------------------------------
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/ptit-louis/iznobe-ptit-louis ».
iznobe@iznobe-pc:~/Scripts$ 

par contre , il n ' a pas " rmdir " /media/yiiut  ... j ' ai du faire une boulette roll

je creuse .

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

Hors ligne

#240 Le 18/04/2025, à 18:29

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

non, non. il ne manque pas de $ : hormis les "paramètres positionnels" ($0, $1...), les variables awk (NF, NFR..., ainsi que les variables définies par l'utilisateur) n'en ont pas.

Dernière modification par Watael (Le 18/04/2025, à 18:31)


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

Hors ligne

#241 Le 18/04/2025, à 18:47

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Avec :

gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'

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

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]}"

j ' obtiens :

iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh 
Utilisation : gawk [options GNU ou POSIX] -f fichier_prog [--] fichier ...
Utilisation : gawk [options GNU ou POSIX] [--] 'programme' fichier ...
Options POSIX :		Options longues GNU : (standard)
	-f fichier_prog		--file=fichier_prog
	-F fs			--field-separator=fs
	-v var=valeur		--assign=var=valeur
Options POSIX :		Options longues GNU : (extensions)
	-b			--characters-as-bytes
	-c			--traditional
	-C			--copyright
	-d[fichier]		--dump-variables[=fichier]
	-D[fichier]		--debug[=fichier]
	-e 'programme'		--source='programme'
	-E fichier		--exec=fichier
	-g			--gen-pot
	-h			--help
	-i fichier		--include=fichier
	-I			--trace
	-l bibliothèque		--load=bibliothèque
	-L[fatal|invalid|no-ext]	--lint[=fatal|invalid|no-ext]
	-M			--bignum
	-N			--use-lc-numeric
	-n			--non-decimal-data
	-o[fichier]		--pretty-print[=fichier]
	-O			--optimize
	-p[fichier]		--profile[=fichier]
	-P			--posix
	-r			--re-interval
	-s			--no-optimize
	-S			--sandbox
	-t			--lint-old
	-V			--version

Pour signaler une anomalie, utilisez le programme « gawkbug ».
Pour des instructions complètes, consultez le nœud « Bugs » de
« gawk.info », qui est dans la section « Reporting Problems and Bugs »
de la version imprimée. Vous trouverez les mêmes informations sur
https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.
MERCI de ne PAS essayer de signaler une anomalie via comp.lang.awk,
ou en utilisant un forum internet tel que Stack Overflow.

Pour signaler une erreur de traduction, envoyez un message à
traduction-gawk@tigreraye.org.

gawk est un langage de recherche et de traitement des motifs.
Par défaut, il lit l'entrée standard et écrit sur la sortie standard.

Exemples :
	gawk '{ somme += $1 }; END { print somme }' fichier
	gawk -F: '{ print $1 }' /etc/passwd
Il n’y a pas de partition susceptible d’être montée.
iznobe@iznobe-pc:~/Scripts$

Alors qu ' avec le " $ " , pas d' erreur , mais ca ne fonctionne pas pour autant puisque ' / ' racine est proposée dans la liste des partition possibles à traiter .

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

Hors ligne

#242 Le 18/04/2025, à 19:51

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

#!/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,1]}" ]]; then
      echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
      exit 4
    fi
  done
}

unmount() {
  local rgx='^(/|/mnt|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'

  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 1
      ;;
      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"
          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 delai , 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 0
fi

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

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 1
    ;;
    Y|y|O|o|"")
      if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
        echo "L’UUID de la partition est déjà présent dans le fstab !"
        unmount        
      elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
        echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
        unmount
      elif grep -q "^$Part" /etc/mtab; then
        echo "La partition « $Part » est déjà montée !"
        unmount
      fi

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

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

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

en fait , il faut eviter de supprimer tous les repertoire de 1er niveau au minimum , enfin ceux par defaut : /bin , etc ...
il faut donc en faire la liste je supopose sur le meme principe que :

unmount() {
  local rgx='^(/|/bin|/mnt|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'

et touti cuenti , non ?

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

Hors ligne

#243 Le 18/04/2025, à 20:18

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

je peux me moquer ? forcément que ça ne marche pas si tu le mets n'importe où. houuuu!

$(lsblk -no path,fstype,mountpoint,label \
    |gawk -v nomVar='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$' -v i=-1 'BEGIN { print "declare -A ListPart" }
...
if ($3 ~ nomVar)...

Dernière modification par Watael (Le 18/04/2025, à 20:22)


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

Hors ligne

#244 Le 18/04/2025, à 20:32

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

Avec :

j ' obtiens :

Alors qu ' avec le " $ " , pas d' erreur , mais ca ne fonctionne pas pour autant puisque ' / ' racine est proposée dans la liste des partition possibles à traiter .

C’est parce que tu n’as pas compris le message #237 de Watael ; gawk n’est pas fait pour déclarer une variable à passer à awk, il était destiné à remplacer awk.



Bon, comme gawk n’est pas installé chez moi, je considère qu’il n’est pas installé par défaut et je continue avec awk.

Donc, tu commences par déclarer ta variable en début de script :

rgx_no_rmdir="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"

Ensuite tu déclares une variable dans awk qui prend la valeur de la variable déclarée ci-dessus et tu l’utilises dans le if :

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

Puis, dans la fonction unmount, tu récupères la variable déclarée au début pour traiter la suppression ou non :

          if ! [[ "$pmp" =~ $rgx_no_rmdir ]]; then
            rmdir -v "$pmp"
          else
            echo "$pmp n’a pas été supprimé."
          fi

 



Le script au complet après ces modifications :

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

rgx_no_rmdir="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"

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

unmount() {
  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_no_rmdir ]]; 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 -v re="$rgx_no_rmdir" \
'BEGIN { print "declare -A ListPart" } \
$2 ~ "ext|ntfs" \
{
  j=0 ;
  if ($3 ~ re)
    { next }
  else
    { print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2"\nListPart["i","++j"]="$3"\nListPart["i","++j"]="$4 }
}')

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 1
    ;;
    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

 
Grilled by Watael!

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

En ligne

#245 Le 18/04/2025, à 20:44

Watael

Re : [ SCRIPT ] pour montage automatique partitions internes

sauf que je n'ai pas vu que la regex était utilisée deux fois dans le script.

bien joué nany !


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

Hors ligne

#246 Le 18/04/2025, à 20:58

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

en fait , il faut eviter de supprimer tous les repertoire de 1er niveau au minimum , enfin ceux par defaut : /bin , etc ...
il faut donc en faire la liste je supopose sur le meme principe que :

et touti cuenti , non ?

J’ai énuméré les répertoires proposés lors de l’installation avec un partitionnement manuel mais libre à toi d’alimenter la variable avec d’autres répertoires que tu juges utile de protéger.

En ligne

#247 Le 18/04/2025, à 23:43

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Watael a écrit :

sauf que je n'ai pas vu que la regex était utilisée deux fois dans le script.

Au depart elle ne l' est pas , puisque @nany proposait de ne pas enumerer certains point de montage au choix de la liste des partitions a traiter .

Mais il n' empêche que si une partition est montée d' une autre manière sur un répertoire ( comme dans l ' exemple que j' ai supprimé roll ) , /mnt ou /media ou n' importe quel autre d' ailleurs , alors ce répertoire sera supprimé dans cette partie de code :

 PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
        for pmp in "${PartMountPoints[@]}"; do
          umount -v "$pmp"
          rmdir -v "$pmp"
          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

Donc , 2 possibilités , soit on traite les conditions pour " rmdir " separément , comme j ' ai ( presque ) fait dans mon dernier script ,
soit on fait une variable que l' on utilise pour eviter d' enumerer et qui ressert aussi pour les conditions du " rmdir " .


je regarderai plus en detail le code de @nany , car j' ai du mal a modifier toute la partie suivante ( même si je comprends ce que cela fait ):

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

Et pour rappel , je ne maîtrise absolument pas bash ni même la moitié des commandes ... je suis un débutant dans le domaine hmm , je me cantonne a des choses basiques ( un petit peu de sed , mais pas du tout awk ou cousins ni plein d' autres )

Dernière modification par iznobe (Le 18/04/2025, à 23:46)

Hors ligne

#248 Le 19/04/2025, à 06:05

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour,



iznobe a écrit :

je regarderai plus en detail le code de @nany , car j' ai du mal a modifier toute la partie suivante ( même si je comprends ce que cela fait ):

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

Bah je pense avoir assez bien détaillé le truc, non ?

Tiens, d’ailleurs, en relisant ce bout de code, je me rends compte que le changement d’ordre de lsblk et le test avec l’expression régulière rendent la variable j inutile.
On peut donc mettre :

$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_rmdir" \
'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 }
}')

 

Et, du coup, je remets le script complet modifié :

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

rgx_no_rmdir="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"

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() {
  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_no_rmdir ]]; 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 -v re="$rgx_no_rmdir" \
'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 }
}')

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

À copier tel quel dans github et à tester en long, en large et en travers.

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

En ligne

#249 Le 19/04/2025, à 07:08

iznobe

Re : [ SCRIPT ] pour montage automatique partitions internes

Bonjour , en me levant , je me dis que c' est mieux de " rmdir " uniquement si on est dans "/media/" ou dans " /mnt " en fait non ?

Bah je pense avoir assez bien détaillé le truc, non ?

oui , tout à fait , j ' ai compris . mais je ne me sens pas de modifié sans grand peine .

Bref , du coup , si je ne me suis pas trompé dans la regex , ca donne ça :

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

rgx_no_list="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"

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 -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 }
}')

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

quelques tests rapides donnent :

Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « rety » ? [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 « rety » ? [O/n] 
umount: /media/opiu (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/opiu'
umount: /mnt démonté
/mnt n’a pas été supprimé.
-----------------------------------------------------------------
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/rety/iznobe-rety ».
iznobe@iznobe-pc:~/Scripts$
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$ 
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « tretr » ? [O/n] 
umount: /mnt démonté
/mnt n’a pas été supprimé.
umount: /media/yhft (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/yhft'
umount: /media/test démonté
rmdir: suppression du répertoire, '/media/test'
umount: /datas/test démonté
/datas/test n’a pas été supprimé.
-----------------------------------------------------------------
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/tretr/iznobe-tretr ».
iznobe@iznobe-pc:~/Scripts$


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 pas ? les champs vides .

Quelle est la subtilité ? car on peut avoir soit 2 soit 3 soit 4 champs par partition ... et lors de la division du coup

En tout cas , je trouve le AWK de maintenant bien plus simple à comprendre .

Desolé , pour la variable "rgx_no_list" qui ne sert plus et le temps que tu as passé  dessus roll

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

Hors ligne

#250 Le 19/04/2025, à 07:30

nany

Re : [ SCRIPT ] pour montage automatique partitions internes

iznobe a écrit :

je me dis que c' est mieux de " rmdir " uniquement si on est dans "/media/" ou dans " /mnt " en fait non ?

Du coup, la variable rgx_no_list perd de son intérêt puisqu’elle n’est appelée qu’une seule fois.




iznobe a écrit :

si je ne me suis pas trompé dans la regex

Je verrais plutôt :

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

Pour être sûr d’avoir affaire à un sous-répertoire.

En ligne