#251 Le 19/04/2025, à 07:40
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
PS : un ptit truc me chiffonne , avant , dans le " AWK " , avec le champ " label " qui pouvait être vide , on ajoutait une " case " vide au tableau pour pouvoir diviser par le nombre de " case " de chaque ligne ( 3 ) .
Là , tu as ajouté un champ : " mountpoint " , qui lui aussi peut etre vide . par contre , tu ne gères plus de la même manière les champs vides .Quelle est la subtilité ?
La subtilité, c’est l’ordre de lsblk. Les champs 1 et 2 sont forcément renseignés et ce sont eux qui nous intéressent. Ensuite, que les champs 3 et 4 soient vides, on s’en balek’.
[edit]
En fait, non, je dit n’importe quoi. Si la partition n’est pas montée et qu’elle a une étiquette, cette dernière ne sera pas récupérée.
Je dois donc revoir cette partie du code.
[/edit]
Dernière modification par nany (Le 19/04/2025, à 07:43)
Hors ligne
#252 Le 19/04/2025, à 07:47
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
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
Bref , j ' ai modifié la regex .
Merci pour tes explications , ton temps et ton aide !
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#253 Le 19/04/2025, à 07:51
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Messages croisés, j’ai édité mon message précédent.
À+, donc.
Hors ligne
#254 Le 19/04/2025, à 07:55
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
oui , j ' ai vu
EDIT1 : Vu que le champ " mountpoint " n ' est pas utile ( meme si ca presente bien , j' avoue ) , je me dis que pour ne pas que ca devienne quasi ingérable et incompréhensible , il vaut mieux revenir à la version à 3 champs , non ?
en incorporant les dernières modifs , cela va de soi .
EDIT2 : ha ba en fait , c' est pas possible ( mountpoint est indispensable ) et label , ca serait dommage mais possible de faire une commande séparée .
Dernière modification par iznobe (Le 19/04/2025, à 08:03)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#255 Le 19/04/2025, à 08:13
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
idée : vu que le champ label ( dans le AWK je parle ) , ne peut pas contenir de caractères spéciaux , autant en ajouter un nous même ( qu ' il est impossible de mettre dans linux et dans windobz bien sur ).
ca nous permettra d' avoir un " fin de ligne " pour scinder non ?
par exemple :
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2"\nListPart["i",2]="$3"\nListPart["i",3]="$4 !}
reste plus qu ' a compter le nombre de " ! " et a scinder juste apres " ! " pour exploiter chaque ligne correspondant a une partition ?
Dernière modification par iznobe (Le 19/04/2025, à 08:19)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#256 Le 19/04/2025, à 08:27
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Non, ce n’est pas possible.
Voilà ce que j’ai fait pour corriger :
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" }
$2 ~ "ext|ntfs" {
if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
next
}
else if ($3 ~ "^/") {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]="$3"\nListPart["i",3]="$4
}
else {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]=\nListPart["i",3]="$3
}
}')
La variable rgx_no_list n’est plus utilisée donc la ligne de sa déclaration peut être supprimée.
Je ne peux pas tester actuellement.
Il faudrait tester avec une partition non montée avec une étiquette.
Dernière modification par nany (Le 19/04/2025, à 08:31)
Hors ligne
#257 Le 19/04/2025, à 08:33
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Il faudrait tester avec une partition non montée avec une étiquette.
tester quoi si elle eslt listée ?
elles l' étaient deja avant , exemple :
iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh
n° ⇒ path label fstype mountpoint
----------------------------------------
1 ⇒ /dev/sda1 WD8 ext4 /media/Videos/WD8
2 ⇒ /dev/sda2 ext4 SAUV
3 ⇒ /dev/sdb3 Data ext4 /datas
4 ⇒ /dev/sdc1 WD8PRO1_P1 ext4 /media/WD8PRO1_P1
5 ⇒ /dev/sdc2 WD8PRO1_P2 ext4 /media/Videos/WD8PRO1_P2
6 ⇒ /dev/sdd1 WD8PRO2 ext4 /media/Videos/WD8PRO2
7 ⇒ /dev/nvme0n1p1 ntfs windows_10
8 ⇒ /dev/nvme0n1p2 ntfs
9 ⇒ /dev/nvme0n1p4 ntfs
10 ⇒ /dev/nvme0n1p5 ext4 LM_21_SSD
11 ⇒ /dev/nvme0n1p6 ext4 U_20.04_SSD
12 ⇒ /dev/nvme0n1p7 ext4 U_22.budgie_SSD
13 ⇒ /dev/nvme0n1p9 ext4 LM_SSD_NEW
14 ⇒ /dev/nvme0n1p10 ext4 DEBIAN_XFCE
15 ⇒ /dev/nvme0n1p11 ext4 Archlinux
16 ⇒ /dev/nvme0n1p12 rety ext4 /mnt/test
Choisissez le numéro correspondant à votre future partition de données : 16
La partition « /dev/nvme0n1p12 » a l’étiquette « rety ».
Voulez-vous changer l’étiquette de la partition « /dev/nvme0n1p12 » ? [O/n]
Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : yhft
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « yhft » ? [O/n]
L’UUID de la partition est déjà présent dans le fstab !
Voulez-vous démonter la partition « /dev/nvme0n1p12 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « yhft » ? [O/n]
umount: /media/rety (/dev/nvme0n1p12) démonté
rmdir: suppression du répertoire, '/media/rety'
umount: /mnt: la cible est active.
/mnt n’a pas été supprimé.
umount: /mnt/test démonté
rmdir: suppression du répertoire, '/mnt/test'
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !
Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/yhft/iznobe-yhft ».
iznobe@iznobe-pc:~/Scripts$
la numero 2 entre dans le cas de figure que tu demandes de tester . elle a une etiquette et n' est actuellement pas montée , et bel et bien listée avec l' ancien code " AWK " .
Dernière modification par iznobe (Le 19/04/2025, à 08:36)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#258 Le 19/04/2025, à 08:46
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
tester quoi si elle eslt listée ?
Non, ça c’est OK.
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 Le 19/04/2025, à 09:06
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
avec le AWK de 4 champs 1er jet :
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 -v re="$rgx_no_list" \
'BEGIN { print "declare -A ListPart" }
$2 ~ "ext|ntfs" \
{
if ($3 ~ re)
{ next }
else
{ print "ListPart["++i",0]="$1"\nListPart["i",1]="$2"\nListPart["i",2]="$3"\nListPart["i",3]="$4 }
}')
resultat :
iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh
n° ⇒ path label fstype mountpoint
----------------------------------------
1 ⇒ /dev/sda1 WD8 ext4 /media/Videos/WD8
2 ⇒ /dev/sda2 ext4 SAUV
3 ⇒ /dev/sdb3 Data ext4 /datas
4 ⇒ /dev/sdc1 WD8PRO1_P1 ext4 /media/WD8PRO1_P1
5 ⇒ /dev/sdc2 WD8PRO1_P2 ext4 /media/Videos/WD8PRO1_P2
6 ⇒ /dev/sdd1 WD8PRO2 ext4 /media/Videos/WD8PRO2
7 ⇒ /dev/nvme0n1p1 ntfs windows_10
8 ⇒ /dev/nvme0n1p2 ntfs
9 ⇒ /dev/nvme0n1p4 ntfs
10 ⇒ /dev/nvme0n1p5 ext4 LM_21_SSD
11 ⇒ /dev/nvme0n1p6 ext4 U_20.04_SSD
12 ⇒ /dev/nvme0n1p7 ext4 U_22.budgie_SSD
13 ⇒ /dev/nvme0n1p9 ext4 LM_SSD_NEW
14 ⇒ /dev/nvme0n1p10 ext4 DEBIAN_XFCE
15 ⇒ /dev/nvme0n1p11 ext4 Archlinux
16 ⇒ /dev/nvme0n1p12 1234567891234567 ext4 /media/tretr
Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sda2 » n’a pas d’étiquette.
Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères :
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#260 Le 19/04/2025, à 09:09
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
avec le nouveau :
iznobe@iznobe-pc:~/Scripts$ sudo bash automount_part_data.sh
n° ⇒ path label fstype mountpoint
----------------------------------------
1 ⇒ /dev/sda1 WD8 ext4 /media/Videos/WD8
2 ⇒ /dev/sda2 SAUV ext4
3 ⇒ /dev/sdb3 Data ext4 /datas
4 ⇒ /dev/sdc1 WD8PRO1_P1 ext4 /media/WD8PRO1_P1
5 ⇒ /dev/sdc2 WD8PRO1_P2 ext4 /media/Videos/WD8PRO1_P2
6 ⇒ /dev/sdd1 WD8PRO2 ext4 /media/Videos/WD8PRO2
7 ⇒ /dev/nvme0n1p1 windows_10 ntfs
8 ⇒ /dev/nvme0n1p2 ntfs
9 ⇒ /dev/nvme0n1p4 ntfs
10 ⇒ /dev/nvme0n1p5 LM_21_SSD ext4
11 ⇒ /dev/nvme0n1p6 U_20.04_SSD ext4
12 ⇒ /dev/nvme0n1p7 U_22.budgie_SSD ext4
13 ⇒ /dev/nvme0n1p9 LM_SSD_NEW ext4
14 ⇒ /dev/nvme0n1p10 DEBIAN_XFCE ext4
15 ⇒ /dev/nvme0n1p11 Archlinux ext4
16 ⇒ /dev/nvme0n1p12 1234567891234567 ext4 /media/tretr
Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sda2 » a l’étiquette « SAUV ».
Voulez-vous changer l’étiquette de la partition « /dev/sda2 » ? [O/n]
donc là , on voit bien que l' étiquette est récupérée correctement .
Dernière modification par iznobe (Le 19/04/2025, à 09:13)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#261 Le 19/04/2025, à 09:17
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bon, eh bien, c’est tout ce que je voulais savoir. Tu peux répondre n aux questions.
Hors ligne
#262 Le 19/04/2025, à 09:28
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Voici donc à quoi devrait ressembler le script après modification :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do
if [[ $Label == "${ListPart[$n,3]}" ]]; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
while [ -z "$rep3" ]; do
read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] " Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep3
exit 0
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ "$pmp" =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 1
fi
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" }
$2 ~ "ext|ntfs" {
if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
next
}
else if ($3 ~ "^/") {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]="$3"\nListPart["i",3]="$4
}
else {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]=\nListPart["i",3]="$3
}
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if [[ -z "$PartLabel" ]]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] " Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]; then
e2label "$Part" "$Label"
echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]; then
ntfslabel "$Part" "$Label"
echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
mkdir /media/"$Label" 2>/dev/null
systemctl daemon-reload
mount -a 2>/dev/null
mkdir /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
mkdir /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chown "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chmod 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
if [ -e /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo ""
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
Hors ligne
#263 Le 19/04/2025, à 09:32
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
ok , j ' ai remis la regex pour le $2 AWK en plus " précise " :
$2 ~ "^(ext[2-4]|ntfs)$" {
et j ' envoie le code avec la derniere modif awk .
Dernière modification par iznobe (Le 19/04/2025, à 09:33)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#264 Le 23/04/2025, à 08:30
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
J’ai (enfin) pris le temps de faire des tests (avec un disque externe, c’est mieux que rien) et j’ai débusqué quelques bugs.
D’abord, lors de la réécriture du script sur 80 colonnes (c’est à dire en limitant les lignes à 80 caractères maximum), j’ai fait une petite erreur dans l’écriture du fstab. Ce qui a eu pour conséquence que le montage ne pouvait pas se faire. Or le script m’annonçait fièrement s’être terminé avec succès, ce qui est faux.
J’ai donc décidé de supprimer toutes les redirections d’erreur vers /dev/null et de mettre les commandes en mode plus ou moins verbeux (c’est bien d’être informé de ce qu’il se passe) sous certaines conditions ainsi que de sortir en cas d’erreur de montage :
…
if ! [ -d /media/"$Label" ]; then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a; then
exit 5
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
…
Puis, suite à cette erreur, j’avais une entrée dans le fstab mais une partition non montée. Alors le script ne supprime pas la ligne dans le fstab.
J’ai donc ajouté une condition plus quelques lignes dans la fonction unmount :
…
unmount() {
…
local mp="$(grep $Label /etc/fstab | cut -d ' ' -f 2)"
…
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
if ! [ -z "$PartMountPoints" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ -d "$pmp" && "$pmp" =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
elif [[ -d "$mp" && "$mp" =~ $rgx ]]; then
rmdir -v "$mp"
elif ! [ -z "$mp" ]; then
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid $Part)/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
…
}
…
Ensuite, pour tester l’existence d’un label, il faut le vérifier pour toutes les partitions et non seulement celles listées préalablement.
Le test dans la fonction label devient alors :
…
if lsblk -no label | grep -q "$Label"; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
…
À ce propos, pour tester ceci, j’ai mis une étiquette sur ma partition fat32 /boot/efi puis j’ai essayé de mettre la même étiquette sur la partition ext4 de mon disque. Eh bien e2label (je n’ai pas pu tester ntslabel) s’est exécuté sans broncher et j’ai donc eu deux partitions avec le même label.
Ce qui m’amène à penser que l’identification par le label dans le fstab n’est pas fiable à 100% et qu’il vaut mieux utiliser les UUID.
Ce script perd alors de son intérêt.
Néanmoins, voici le script au complet avec mes corrections :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
while [ -z "$Label" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
if lsblk -no label | grep -q "$Label"; then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 4
fi
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp="$(grep $Label /etc/fstab | cut -d ' ' -f 2)"
while [ -z "$rep3" ]; do
read -rp "Voulez-vous démonter la partition « $Part » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « $Label » ? [O/n] " Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep3
exit 0
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
if ! [ -z "$PartMountPoints" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [[ -d "$pmp" && "$pmp" =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
numLines=( $(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
elif [[ -d "$mp" && "$mp" =~ $rgx ]]; then
rmdir -v "$mp"
elif ! [ -z "$mp" ]; then
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid $Part)/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 1
fi
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" }
$2 ~ "^(ext[2-4]|ntfs)$" {
if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
next
}
else if ($3 ~ "^/") {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]="$3"\nListPart["i",3]="$4
}
else {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]=\nListPart["i",3]="$3
}
}')
if [ "${#ListPart[@]}" == "0" ]; then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 8
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ )); do
echo "$((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]] || ! (( PartNum > 0 && PartNum <= nbDev )); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if [[ -z "$PartLabel" ]]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] " Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » ? [O/n] " Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab; then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]; then
e2label "$Part" "$Label"
echo "LABEL=$Label /media/$Label $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]; then
ntfslabel "$Part" "$Label"
echo "LABEL=$Label /media/$Label ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$Label" ]; then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a; then
exit 5
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]; then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID"
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]; then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "erreur inconnue !"
exit 10
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
Et, pour le fun, sa version en 80 colonnes (je ne sais pas si c’est plus lisible mais je la préfère) :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet
# avertissement, vous pouvez faire ce que vous voulez de ce truc. Si on se
# rencontre un jour et que vous pensez que ce truc vaut le coup, vous pouvez
# me payer une bière en retour. iznobe
# ----------------------------------------------------------------------------
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
rgx+="0123456789_-]"
while [ -z "$Label" ]
do
echo -n "Choisissez l’étiquette (LABEL) de votre partition de données, "
echo -n "elle doit être UNIQUE et ne pas contenir d’espace, d’accent, "
echo -n "de caractères spéciaux et au maximum 16 caractères : "
read -r Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]
then
echo -n "Le nom de votre étiquette comporte une espace, un accent ou un "
echo "caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
if lsblk -no label | grep -q "$Label"
then
echo "Erreur, votre étiquette « $Label » est déjà attribuée !"
exit 3
fi
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp="$(grep $Label /etc/fstab | cut -d ' ' -f 2)"
while [ -z "$rep3" ]
do
echo -n "Voulez-vous démonter la partition « $Part » de son emplacement "
echo -n "actuel et procéder aux changements pour la monter avec "
echo -n "l'étiquette « $Label » ? [O/n] "
read -r Rep3
case "$Rep3" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep3
exit 0
;;
Y|y|O|o|"")
PartMountPoints=( $(grep "$Part" /etc/mtab | cut -d " " -f 2) )
if ! [ -z "$PartMountPoints" ]
then
for pmp in "${PartMountPoints[@]}"
do
umount -v "$pmp"
if [[ -d "$pmp" && "$pmp" =~ $rgx ]]
then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
fi
numLines=( $(grep -n "$pmp" /etc/fstab |
cut -d ":" -f 1 | sort -rn) )
for n in "${numLines[@]}"
do
sed -i "${n}d" /etc/fstab
done
done
elif [[ -d "$mp" && "$mp" =~ $rgx ]]
then
rmdir -v "$mp"
elif ! [ -z "$mp" ]
then
echo "$mp n’a pas été supprimé."
fi
sed -i "/$(lsblk -no uuid $Part)/d" /etc/fstab
sed -i "/$Label/d" /etc/fstab
# Prise en compte du montage par le dash,
# sans délai, parfois la partition ne s’affiche pas.
sleep 1
unset Rep3
break
;;
*)
unset Rep3
;;
esac
done
}
if ((UID))
then
echo -n "Vous devez être super utilisateur pour lancer ce script "
echo "(essayez avec « sudo »)."
exit 1
fi
$(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 'BEGIN { print "declare -A ListPart" }
$2 ~ "^(ext[2-4]|ntfs)$" {
if ($3 ~ "^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$") {
next
}
else if ($3 ~ "^/") {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]="$3"\nListPart["i",3]="$4
}
else {
print "ListPart["++i",0]="$1"\nListPart["i",1]="$2
print "ListPart["i",2]=\nListPart["i",3]="$3
}
}')
if [ "${#ListPart[@]}" == "0" ]
then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo "n° ⇒ path label fstype mountpoint"
echo "----------------------------------------"
for (( n=0; n<nbDev; n++ ))
do
echo -n "$((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]}"
echo " ${ListPart[$n,1]} ${ListPart[$n,2]}"
done
echo
while [ -z "$PartNum" ]
do
echo -n "Choisissez le numéro correspondant "
echo -n "à votre future partition de données : "
read -r PartNum
if ! [[ "$PartNum" =~ ^[1-9][0-9]*$ ]] ||
! (( PartNum > 0 && PartNum <= nbDev ))
then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if [[ -z "$PartLabel" ]]
then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]
do
echo -n "Voulez-vous changer l’étiquette "
echo -n "de la partition « $Part » ? [O/n] "
read -r Rep
case "$Rep" in
N|n)
Label="$PartLabel"
unset Rep
break
;;
Y|y|O|o|"")
label
unset Rep
break
;;
*)
unset Rep
;;
esac
done
fi
while [ -z "$Rep2" ]
do
echo -n "Voulez-vous procéder au montage maintenant pour la partition "
echo -n "« $Part » en y mettant pour étiquette « $Label » ? [O/n] "
read -r Rep2
case "$Rep2" in
N|n)
echo "Annulation par l’utilisateur !"
unset Rep2
exit 0
;;
Y|y|O|o|"")
if grep -q $(lsblk -no uuid "$Part") /etc/fstab
then
echo "L’UUID de la partition est déjà présent dans le fstab !"
unmount
elif grep -Eq "(LABEL=|by-label/)$Label" /etc/fstab
then
echo "L’étiquette « $Label » est déjà utilisée dans le fstab !"
unmount
elif grep -q "^$Part" /etc/mtab
then
echo "La partition « $Part » est déjà montée !"
unmount
fi
# construction des éléments :
if [[ "$PartFstype" =~ ext[2-4] ]]
then
e2label "$Part" "$Label"
echo -n "LABEL=$Label /media/$Label $PartFstype " >> /etc/fstab
echo "defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [[ "$PartFstype" == "ntfs" ]]
then
ntfslabel "$Part" "$Label"
echo -n "LABEL=$Label /media/$Label ntfs3 defaults," >> /etc/fstab
echo -n "nofail,x-systemd.device-timeout=1,x-gvfs-show," >> /etc/fstab
echo "nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$Label" ]
then
mkdir -v /media/"$Label"
fi
systemctl daemon-reload
if ! mount -a
then
exit 4
fi
if ! [ -d /media/"$Label"/"$SUDO_USER"-"$Label" ]
then
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
fi
chown -c "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label" 2>/dev/null
if ! [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]
then
mkdir -v /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
fi
chown -c "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
chmod -c 700 /media/"$Label"/.Trash-"$SUDO_UID" 2>/dev/null
if [ -d /media/"$Label"/.Trash-"$SUDO_UID" ]
then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo -n "Vous pouvez maintenant accéder à votre partition en parcourant"
echo " le dossier suivant : « /media/$Label/$SUDO_USER-$Label »."
else
echo "Erreur inconnue !"
exit 5
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
(Pour faire plaisir à RaphaelG, j’ai enlevé les points-virgules dans les if/while/for.)
(J’ai aussi revu la numérotation des exit.)
Hors ligne
#265 Le 23/04/2025, à 10:00
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
cette regex en deux temps m'agace, d'autant plus que je n'ai pas de problème à utiliser
rgx='[^[:alnum:]_-]'
[[ $Label =~ $rgx || ${#Label} -gt 16 ]] && echo "Label has space or is too long"
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#266 Le 23/04/2025, à 10:22
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
[:alnum:] comprend aussi les signes diacritiques. Or il ne faut pas les inclure.
D’où cette regex à rallonge d’iznobe.
Hors ligne
#267 Le 23/04/2025, à 10:37
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
y a-t-il des filtres sur des sorties de commandes en français ?
sinon, on peut ajouter un export LC_ALL=C au début du script.
non ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#268 Le 23/04/2025, à 10:41
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :
LANG=C local rgx="[^[:alnum:]_-]"
Hors ligne
#269 Le 23/04/2025, à 10:44
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Messages croisés.
y a-t-il des filtres sur des sorties de commandes en français ?
Je ne crois pas. Donc,
sinon, on peut ajouter un export LC_ALL=C au début du script.
non ?
C’est une possibilité, effectivement.
Hors ligne
#270 Le 23/04/2025, à 11:00
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :LANG=C local rgx="[^[:alnum:]_-]"
Ça fonctionne.
Messages croisés.
Watael a écrit :y a-t-il des filtres sur des sorties de commandes en français ?
Je ne crois pas. Donc,
Watael a écrit :sinon, on peut ajouter un export LC_ALL=C au début du script.
non ?C’est une possibilité, effectivement.
En fait, il y a des commandes qui donnent leur retour en anglais.
Je privilégierais donc la première solution.
Hors ligne
#271 Le 23/04/2025, à 11:02
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :LANG=C local rgx="[^[:alnum:]_-]"
hmm, pas convaincu après quelques tests : le problème ne vient pas de la définition de la regex, mais du moment de la comparaison (=~).
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#272 Le 23/04/2025, à 11:06
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
En fait, il y a des commandes qui donnent leur retour en anglais.
est-ce que les filtres doivent être modifiés, et est-ce que ça perturbe l'affichage pour l'utilisateur ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#273 Le 23/04/2025, à 11:13
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
nany a écrit :En revanche, la suggestion de sputnick semble fonctionner mais n’avait apparemment pas été testée par iznobe.
Donc on pourrait mettre :LANG=C local rgx="[^[:alnum:]_-]"
hmm, pas convaincu après quelques tests : le problème ne vient pas de la définition de la regex, mais du moment de la comparaison (=~).
J’ai pourtant testé avec succès.
En fait, il y a des commandes qui donnent leur retour en anglais.
est-ce que les filtres doivent être modifiés,
A priori, non.
et est-ce que ça perturbe l'affichage pour l'utilisateur ?
Bah, il y a du mélange de français et d’anglais. Je ne trouve pas ça terrible.
Dernière modification par nany (Le 23/04/2025, à 11:13)
Hors ligne
#274 Le 23/04/2025, à 11:54
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
bizarre. l'export devrait tout mettre en anglais.
lesquelles restent en français ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#275 Le 23/04/2025, à 11:59
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
En fait, c’est les echo "texte" où le texte est en français dans le code du script.
D’où le fait que je préférerais avoir des retours de commandes en français aussi.
Hors ligne