#351 Le 30/04/2025, à 07:41
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
mouais, declare -n et pas declare -na.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#352 Le 30/04/2025, à 07:54
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
je pense qu'il est temps de réécrire complètement ton script au propre, parce que depuis que tu l'as commencé, et avec tous les petits bouts ajoutés, il ressemble à un patchwork cousu avec du fil d'araignée. Et je déteste ça, le patchwork.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#353 Le 30/04/2025, à 07:55
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
bon voilà une version qui devrait te plaire un peu plus :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
LC_ALL=C
choixlabel() {
local rgx="[^[:alnum:]_-.]"
while [ -z "$newLabel" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " newLabel
if [[ $newLabel =~ $rgx || ${#newLabel} -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset newLabel
fi
for i in ${!ListPart[*]}; do
if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
break
fi
done
done
}
delMountPoints() {
local rgx="^(/mnt/|/media/).+$"
# traitement des partitions montées :
mapfile -t PartMountPoints < <(grep "$Part" /etc/mtab | cut -d " " -f 2)
if [ -n "${PartMountPoints[0]}" ]; then
for pmp in "${PartMountPoints[@]}"; do
umount -v "$pmp"
if [ -d "$pmp" ]; then
if [[ $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$pmp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
fi
# traitement des partitions NON montées :
mapfile -t mountPoints < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
if [ -n "${mountPoints[0]}" ]; then
for mp in "${mountPoints[@]}"; do
if [ -d "$mp" ]; then
if [[ $mp =~ $rgx ]]; then
rmdir -v "$mp"
else
echo "$mp a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$mp" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
fi
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if [ -z "$PartLabel" ]; then
echo "La partition « $Part » n’a pas d’étiquette."
choixlabel
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
newLabel="$PartLabel"
break
;;
Y|y|O|o|"")
choixlabel
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
q=1
fi
while ((q=1)); do
read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
break
;;
*)
;;
esac
done
# sauvegarde
echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
cp /etc/fstab /etc/fstab.BaK
# nettoyage
delMountPoints
# construction des éléments :
if [[ $PartFstype =~ ext[2-4] ]]; then
e2label "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [ "$PartFstype" == "ntfs" ]; then
ntfslabel "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$newLabel" ]; then
mkdir -v /media/"$newLabel"
fi
systemctl daemon-reload
if ! mount -a; then
echo "erreur innatendue , annulation des modifications !"
rmdir -v /media/"$newLabel"
systemctl daemon-reload
exit 3
fi
if ! [ -d /media/"$newLabel"/"$SUDO_USER"-"$newLabel" ]; then
mkdir -v /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
if ! [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$newLabel"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$newLabel"/.Trash-"$SUDO_UID"
if [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel »."
sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
else
echo "Erreur inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
oui ba maintenant qu ' il est fini , autant repartir de zero
Dernière modification par iznobe (Le 30/04/2025, à 07:58)
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#354 Le 30/04/2025, à 08:17
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
bon et cette fois la version finale :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
LC_ALL=C
chooseLabel() {
local rgx="[^[:alnum:]_-.]"
while [ -z "$newLabel" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " newLabel
if [[ $newLabel =~ $rgx || ${#newLabel} -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset newLabel
fi
for i in ${!ListPart[*]}; do
if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
break
fi
done
done
}
delMountPoints() {
local rgx="^(/mnt/|/media/).+$"
declare -n parts=$1
for part in "${parts[@]}"; do
if test "$1" = 'mountedParts'; then umount -v "$part"; fi
if [ -d "$part" ]; then
if [[ $part =~ $rgx ]]; then
rmdir -v "$part"
else
echo "$part a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if [ -z "$PartLabel" ]; then
echo "La partition « $Part » n’a pas d’étiquette."
chooseLabel
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
newLabel="$PartLabel"
break
;;
Y|y|O|o|"")
chooseLabel
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
q=1
fi
while ((q=1)); do
read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
break
;;
*)
;;
esac
done
# sauvegarde
echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
cp /etc/fstab /etc/fstab.BaK
# nettoyage
# traitement des partitions montées
mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
delMountPoints mountedParts
# traitement des partitions NON montées
mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoints unmountedParts
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
# construction des éléments :
if [[ $PartFstype =~ ext[2-4] ]]; then
e2label "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [ "$PartFstype" == "ntfs" ]; then
ntfslabel "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$newLabel" ]; then
mkdir -v /media/"$newLabel"
fi
systemctl daemon-reload
if ! mount -a; then
echo "erreur innatendue , annulation des modifications !"
umount -v /media/"$newLabel"
rmdir -v /media/"$newLabel"
systemctl daemon-reload
exit 3
fi
if ! [ -d /media/"$newLabel"/"$SUDO_USER"-"$newLabel" ]; then
mkdir -v /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
if ! [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$newLabel"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$newLabel"/.Trash-"$SUDO_UID"
if [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel »."
sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
else
echo "Erreur inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
Dernière modification par iznobe (Le 30/04/2025, à 08:27)
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#355 Le 30/04/2025, à 08:25
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
"fini", ça ne veut pas dire "bien fait".
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#356 Le 30/04/2025, à 08:45
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
certes , mais re organiser les " etapes " , ajouter la sauvegarde du fichier fstab et ajouter la question de confirmation supplémentaire en cas de détection d ' anomalies .
ce n' est peut être pas "bien fait" , mais c' est déjà pas si mal . je trouve qu il couvre bien plus que la majorité des cas , pour ne pas dire tous les cas envisageables grace à l' aide des contributeurs sur ce post que je remercient encore à nouveau pour leur aide d ' ailleurs .
et de mon propre chef , je n' arriverais pas en faire la moitié de toute manière .
veux tu l' accès au github pour modifier et que je crée une version de dev ?
Dernière modification par iznobe (Le 30/04/2025, à 14:39)
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#357 Le 27/08/2025, à 17:25
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour , dans le cas où une étiquette invalide a été entrée avant le script , comme c' est le cas dans cette discussion : https://forum.ubuntu-fr.org/viewtopic.php?id=2092259
Cela parait il correct pour palier de façon sûre au problème qui n' était pas géré auparavant par le script :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
LC_ALL=C
checkLabel () {
local rgx="[^[:alnum:]_-.]"
test -n "$1" && newLabel="$1"
if [[ $newLabel =~ $rgx || ${#newLabel} -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset newLabel
fi
for i in ${!ListPart[*]}; do
if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
break
fi
done
}
chooseLabel() {
while [ -z "$newLabel" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " newLabel
checkLabel
done
}
delMountPoints() {
local rgx="^(/mnt/|/media/).+$"
declare -n parts=$1
for part in "${parts[@]}"; do
if test "$1" = 'mountedParts'; then umount -v "$part"; fi
if [ -d "$part" ]; then
if [[ $part =~ $rgx ]]; then
rmdir -v "$part"
else
echo "$part a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "-----------------------------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if test -z "$PartLabel" -a ; then
echo "La partition « $Part » n’a pas d’étiquette."
chooseLabel
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
if ! checkLabel "$PartLabel";then
echo "étiquette incorrecte ! vous devez choisir une étiquette valide"
chooseLabel
fi
while true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
newLabel="$PartLabel"
break
;;
Y|y|O|o|"")
chooseLabel
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
q=1
fi
while ((q=1)); do
read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
break
;;
*)
;;
esac
done
# sauvegarde
echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
cp /etc/fstab /etc/fstab.BaK
# nettoyage
# traitement des partitions montées
mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
delMountPoints mountedParts
# traitement des partitions NON montées
mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoints unmountedParts
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
# construction des éléments :
if [[ $PartFstype =~ ext[2-4] ]]; then
e2label "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [ "$PartFstype" == "ntfs" ]; then
ntfslabel "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$newLabel" ]; then
mkdir -v /media/"$newLabel"
fi
systemctl daemon-reload
if ! mount -a; then
echo "erreur innatendue , annulation des modifications !"
umount -v /media/"$newLabel"
rmdir -v /media/"$newLabel"
systemctl daemon-reload
exit 3
fi
if ! [ -d /media/"$newLabel"/"$SUDO_USER"-"$newLabel" ]; then
mkdir -v /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
if ! [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$newLabel"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$newLabel"/.Trash-"$SUDO_UID"
if [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel »."
sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
else
echo "Erreur inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#358 Hier à 00:32
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Finalement , apres test , j ' ai apporté de nouvelles modifications pour que cela fonctionne :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
LC_ALL=C
checkLabel () {
local rgx="[^[:alnum:]_-.]"
test -n "$1" && newLabel="$1"
if [[ $newLabel =~ $rgx || ${#newLabel} -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset newLabel
fi
if test -z "$1"; then
for i in ${!ListPart[*]}; do
if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
break
fi
done
fi
}
chooseLabel() {
while [ -z "$newLabel" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " newLabel
checkLabel
done
}
delMountPoints() {
local rgx="^(/mnt/|/media/).+$"
declare -n parts=$1
for part in "${parts[@]}"; do
if test "$1" = 'mountedParts'; then umount -v "$part"; fi
if [ -d "$part" ]; then
if [[ $part =~ $rgx ]]; then
rmdir -v "$part"
else
echo "$part a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "-----------------------------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$((PartNum-1)),0]}"
PartLabel="${ListPart[$((PartNum-1)),3]}"
PartFstype="${ListPart[$((PartNum-1)),1]}"
if test -z "$PartLabel";then
echo "La partition « $Part » n’a pas d’étiquette."
chooseLabel
elif checkLabel "$PartLabel"; then
echo "La partition « $Part » a l’étiquette « $PartLabel »."
echo "étiquette incorrecte ! vous devez choisir une étiquette valide."
unset newLabel
chooseLabel
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
newLabel="$PartLabel"
break
;;
Y|y|O|o|"")
chooseLabel
break
;;
*)
;;
esac
done
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
echo "les lignes contenant cet UUID seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
echo "les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez"
q=1
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
echo "la partition sera demontée , le fichier /etc/fstab nettoyé , et la partition sera à nouveau montée si vous poursuivez"
q=1
fi
while ((q=1)); do
read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
break
;;
*)
;;
esac
done
# sauvegarde
echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
cp /etc/fstab /etc/fstab.BaK
# nettoyage
# traitement des partitions montées
mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
delMountPoints mountedParts
# traitement des partitions NON montées
mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoints unmountedParts
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
# construction des éléments :
if [[ $PartFstype =~ ext[2-4] ]]; then
e2label "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [ "$PartFstype" == "ntfs" ]; then
ntfslabel "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$newLabel" ]; then
mkdir -v /media/"$newLabel"
fi
systemctl daemon-reload
if ! mount -a; then
echo "erreur innatendue , annulation des modifications !"
umount -v /media/"$newLabel"
rmdir -v /media/"$newLabel"
systemctl daemon-reload
exit 3
fi
if ! [ -d /media/"$newLabel"/"$SUDO_USER"-"$newLabel" ]; then
mkdir -v /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
if ! [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$newLabel"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$newLabel"/.Trash-"$SUDO_UID"
if [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
echo
echo "-----------------------------------------------------------------"
echo "Script pour montage de partition de données terminé avec succès !"
echo
echo "Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel »."
sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
else
echo "Erreur inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
Dernière modification par iznobe (Hier à 00:41)
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#359 Hier à 11:22
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
bon , et bien ca ne fonctionne toujours pas .
Je sais pas pourquoi , mais je n' arrive pas a " recuperer " une sortie de la fonction ( j ' ai essayer avec " return " et tout un tas de truc ) pour faire en sorte que la condition fonctionne dans le cas ou une étiquette valide / invalide est déjà présente ...
le probleme est peut etre dans la regex ?
exemple de retour :
iznobe@iznobe-pc:~$ sudo bash Scripts/automount_part_data.sh
n° ⇒ path label fstype mountpoint
-----------------------------------------------------------------
1 ⇒ /dev/sda1 Seagate/4T ext4
...
Choisissez le numéro correspondant à votre future partition de données : 1
La partition « /dev/sda1 » a l’étiquette « Seagate/4T ».
Voulez-vous changer l’étiquette de la partition « /dev/sda1 » ? [O/n] n
iznobe@iznobe-pc:~$
un " / " devrait etre considéré comme un caractere non accepté , à priori ce n' est pas le cas .
Dernière modification par iznobe (Hier à 12:38)
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#360 Hier à 12:49
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
test avec le code suivant :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
LC_ALL=C
checkLabel () {
local rgx="[^[:alnum:]_-/.]"
#local rgx="abcdefghijklmnopqrstuvwxyz_-.ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
test -n "$1" && newLabel="$1"
echo "$newLabel"
#(( $#>0 )) && newLabel="$1"
if [[ $newLabel =~ $rgx || ${#newLabel} -gt 16 ]]; then
echo "Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset newLabel
return 1
else
return 0
fi
}
checkLabel "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
echo "$?"
quelques retours :
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
/
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
a
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !
1
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
!
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
é
0
iznobe@iznobe-pc:~$ sudo bash Scripts/testeur.sh
%
0
iznobe@iznobe-pc:~$
la regex ne convient pas ...
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#361 Hier à 13:07
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour,
Du mal à remettre le nez dedans mais,
un " / " devrait etre considéré comme un caractere non accepté , à priori ce n' est pas le cas .
Le point désignant n’importe quel caractère, « / » est logiquement accepté.
Essaie :
local rgx="[^[:alnum:]_-\.]"
En ligne
#362 Hier à 13:32
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
j ' ai deja essayé mais non ...
Par contre , je viens de trouver qu ' avec :
local rgx="[^[:alnum:]_.-]"
là ca fonctionne ... le point en dernier emplacement avant un crochet a une signification particulière ? et si il n' est pas juste avant le crochet une autre ?
voici ce que j' ai pondu :
#!/bin/bash
# ----------------------------------------------------------------------------
# "LICENCE BEERWARE" (Révision 42):
# <iznobe@forum.ubuntu-fr.org> a créé ce fichier. Tant que vous conservez cet avertissement,
# vous pouvez faire ce que vous voulez de ce truc. Si on se rencontre un jour et
# que vous pensez que ce truc vaut le coup, vous pouvez me payer une bière en
# retour.
# ----------------------------------------------------------------------------
LC_ALL=C
err() {
>&2 echo -e "\\033[1;31m Erreur : $* \\033[0;0m"
}
checkLabel() {
test -n $1 || exit
#local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-]"
local rgx="[^[:alnum:]_.-]"
if [[ $1 =~ $rgx || ${#1} -gt 16 ]]; then
unset PartLabel
return 1
fi
}
chooseLabel() {
local rgx="[^[:alnum:]_.-]"
while [ -z "$newLabel" ]; do
read -rp "Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : " newLabel
if [[ $newLabel =~ $rgx || ${#newLabel} -gt 16 ]]; then
err "le nom de votre étiquette comporte une espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset newLabel
fi
for i in ${!ListPart[*]}; do
if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then
err "votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
break
fi
done
done
}
delMountPoints() {
local rgx="^(/mnt/|/media/).+$"
declare -n parts=$1
for part in "${parts[@]}"; do
if test "$1" = 'mountedParts'; then umount -v "$part"; fi
if [ -d "$part" ]; then
if [[ $part =~ $rgx ]]; then
rmdir -v "$part"
else
echo "$part a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$part" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
}
if ((UID)); then
err "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo $0 »)."
exit 1
fi
declare -A ListPart
declare -A Rgx=( [fstype]="^(ext[2-4]|ntfs)" [mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$" )
i=-1
while read -ra lsblkDT; do #path fstype mountpoint label
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]; then
if [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]; then
continue
else
((++i))
ListPart[$i,0]="${lsblkDT[0]}"
ListPart[$i,1]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,2]="${lsblkDT[2]}"
ListPart[$i,3]="${lsblkDT[3]}"
else
ListPart[$i,2]=""
ListPart[$i,3]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
if ((${#ListPart[@]} == 0)); then
err "il n’y a pas de partition susceptible d’être montée."
exit 2
fi
nbDev=$(("${#ListPart[@]}"/4))
echo
echo " n° ⇒ path label fstype mountpoint"
echo "-----------------------------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
if ((n+1 < 10)); then
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
else
echo " $((n+1)) ⇒ ${ListPart[$n,0]} ${ListPart[$n,3]} ${ListPart[$n,1]} ${ListPart[$n,2]}"
fi
done
echo
while [ -z "$PartNum" ]; do
read -rp "Choisissez le numéro correspondant à votre future partition de données : " PartNum
if ! [[ $PartNum =~ ^[1-9][0-9]*$ ]] || ! ((PartNum > 0 && PartNum <= nbDev)); then
err "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 test -z "$PartLabel";then
echo "La partition « $Part » n’a pas d’étiquette."
chooseLabel
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
checkLabel "$PartLabel"
if (( $? == 1 )); then
err "étiquette invalide !"
unset newLabel
chooseLabel
else
while true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
newLabel="$PartLabel"
break
;;
Y|y|O|o|"")
chooseLabel
break
;;
*)
;;
esac
done
fi
fi
while true; do
read -rp "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
err "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
if grep -q "$(lsblk -no uuid "$Part")" /etc/fstab; then
echo "L’UUID de la partition est déjà présent dans le fstab !"
echo "le fichier /etc/fstab sera mis à jour si vous poursuivez"
q=1
elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
echo "le fichier /etc/fstab sera mis à jour si vous poursuivez"
q=1
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
echo "la partition sera démontée , le fichier /etc/fstab sera mis à jour si vous poursuivez"
q=1
fi
while ((q=1)); do
read -rp "Etes-vous SÛR de vouloir procéder au montage pour la partition « $Part » en y mettant pour étiquette « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
err "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
break
;;
*)
;;
esac
done
# sauvegarde
echo "sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications"
cp /etc/fstab /etc/fstab.BaK
# nettoyage
# traitement des partitions montées
mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
delMountPoints mountedParts
# traitement des partitions NON montées
mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoints unmountedParts
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
sleep 1 # Prise en compte du montage par le dash, sans délai, parfois la partition ne s’affiche pas.
# construction des éléments :
if [[ $PartFstype =~ ext[2-4] ]]; then
e2label "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1" >> /etc/fstab
elif [ "$PartFstype" == "ntfs" ]; then
ntfslabel "$Part" "$newLabel"
echo "LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID" >> /etc/fstab
fi
if ! [ -d /media/"$newLabel" ]; then
mkdir -v /media/"$newLabel"
fi
systemctl daemon-reload
if ! mount -a; then
err "inattendue , annulation des modifications !"
umount -v /media/"$newLabel"
rmdir -v /media/"$newLabel"
systemctl daemon-reload
exit 3
fi
if ! [ -d /media/"$newLabel"/"$SUDO_USER"-"$newLabel" ]; then
mkdir -v /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/"$SUDO_USER"-"$newLabel"
if ! [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
mkdir -v /media/"$newLabel"/.Trash-"$SUDO_UID"
fi
chown -c "$SUDO_USER": /media/"$newLabel"/.Trash-"$SUDO_UID"
chmod -c 700 /media/"$newLabel"/.Trash-"$SUDO_UID"
if [ -d /media/"$newLabel"/.Trash-"$SUDO_UID" ]; then
echo
echo "Création de la corbeille réussie"
echo "-----------------------------------------------------------------"
echo -e "\\033[1;34m Script pour montage de partition de données terminé avec succès ! \\033[0;0m"
echo
echo -e "\\033[1;34m Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/$newLabel/$SUDO_USER-$newLabel » . \\033[0;0m"
sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1
else
err "inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
ce n' est peut être pas idéal , mais au moins ( je pense ) que ça fonctionne .
j ' ai actualisé github .
Dernière modification par iznobe (Aujourd'hui à 00:37)
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#363 Aujourd'hui à 19:11
- RaphaelG
Re : [ SCRIPT ] pour montage automatique partitions internes
Une petite mise au point sur les regexes :
A l'intérieure d'une "bracket expression" (un truc du genre [.....], mes tentatives de traduire cette expression en français ne m'ont pas satisfait. Dans la littérature on voit aussi "character class" mais dans "man 7 regex" on n'utilise que "bracket expression") les caractères perdent leur propriété spéciale. Ainsi le '.' qui est normalement un joker (wildcard) pouvant toucher n'importe quel caractère, perd cette propriété pour prendre sa valeur littérale. C'est d'ailleurs ce que tu souhaites dans le cas qui nous intéresse.
Mais le '-' est un métacaractère pour les bracket expressions. Il est utilisé pour créer un intervalle. Ainsi, le motif "[0-9]" touche tous les chiffres du système décimal.
Si on veut utiliser le caractère '-' pour sa valeur littérale alors il faut le mettre soit juste derrière le caractère '[' ou juste derrrière la séquence "[^" ou juste devant le caractère ']'.
Les motifs correspondants à ta recherche sont multiples. Outre "[^[:alnum:]_.-]" que tu as trouvé, il y a aussi "[^-[:alnum:]_.]" et plein d'autres combinaisons car l'ordre entre "[:alpnum;]", '_' et '.' n'a pas d'importance.
Hors ligne
#364 Aujourd'hui à 19:34
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Salut RaphaelG , merci pour cette explication , maintenant , je comprends mieux pourquoi ça fonctionne l ' expression que j' ai trouvée , un peu au pif , faut l' avouer ...
le truc c ' était pas le point mais le tiret qui faisait que ca merdoyait ...
Bon , j ' ai toujours un peu galérer avec les regex ( même si c' est pas le seul point avec lequel je galère )
il faudrait que je pratique bien plus souvent pour que je n ' oublie pas , tout le problème est là ...
retour COMPLET et utilisable de commande | script montage partitions | script install auto BROTHER]
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne