#351 Aujourd'hui à 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.
Hors ligne
#352 Aujourd'hui à 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.
Hors ligne
#353 Aujourd'hui à 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 (Aujourd'hui à 07:58)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#354 Aujourd'hui à 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 (Aujourd'hui à 08:27)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#355 Aujourd'hui à 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.
Hors ligne
#356 Aujourd'hui à 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 (Aujourd'hui à 14:39)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne