#276 Hier à 12:13
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
D’ailleurs, l’export impacte la session en cours au lieu de ne modifier que pour le script.
En ligne
#277 Hier à 12:15
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
On en revient donc là.
Chez moi, la première solution fonctionne.
En ligne
#278 Hier à 12:20
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
si on n'exporte pas la locale (on se contente de la définir : LC_ALL=C), alors les commandes externes n'en héritent pas, et seul l'environnement du script s'y conforme.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#279 Hier à 12:21
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
D’ailleurs, l’export impacte la session en cours au lieu de ne modifier que pour le script.
ça, ce n'est pas possible, à moins de sourcer le script.
Dernière modification par Watael (Hier à 12:21)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#280 Hier à 12:42
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
En effet.
Je ne sais pas ce qu’il s’est passé chez moi mais ma locale était passée en anglais.
Ceci dit, LANG=C local rgx="[^[:alnum:]_-]" fonctionnant chez moi, je ne vois pas pas de raison de ne pas l’utiliser.
En ligne
#281 Hier à 13:01
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
parce que ça ne fonctionne pas chez moi.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#282 Hier à 13:24
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Oui, et en fait ça ne fonctionnait que du fait du dérèglement de ma locale.
En ligne
#283 Hier à 14:12
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bon eh bien tant pis pour les retours en anglais:
#!/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.
# ----------------------------------------------------------------------------
export LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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 sur 80 colonnes:
#!/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
# ----------------------------------------------------------------------------
export LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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
Dernière modification par nany (Hier à 14:37)
En ligne
#284 Hier à 14:17
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
si on n'exporte pas la locale (on se contente de la définir : LC_ALL=C), alors les commandes externes n'en héritent pas, et seul l'environnement du script s'y conforme.
non ?
Dernière modification par Watael (Hier à 14:17)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#285 Hier à 14:19
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Oui.
Je parle bien des retours de commandes dans le script.
En ligne
#286 Hier à 14:29
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
oui. sans export, les retours des commandes externes devraient rester en français.
#!/bin/bash
LC_ALL=C
maFonc () {
rgx='[^[:alnum:]_-]'
var='polémik'
[[ $var =~ $rgx ]] && echo "err in Label"
}
set -x
maFonc
set +x
cp -v fichierNonExistant $0.bak
$ ./monScript
+ maFonc
+ rgx='[^[:alnum:]_-]'
+ var=$'pol\303\251mik'
+ [[ polémik =~ [^[:alnum:]_-] ]]
+ echo 'err in Label'
err in Label
+ set +x
cp: impossible d'évaluer 'fichierNonExistant': Aucun fichier ou dossier de ce nom
$
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#287 Hier à 14:36
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
OK, je testerai quand je serai de retour chez moi.
En ligne
#288 Hier à 17:29
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
je testerai quand je serai de retour chez moi.
Ça marche !
Donc, dernière mouture :
#!/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
label() {
local rgx="[^[:alnum:]_-]"
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 3
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 2
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 4
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 5
fi
unset Rep2
break
;;
*)
unset Rep2
;;
esac
done
Et en version 80 colonnes :
#!/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
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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
À tester dans tous les sens.
En ligne
#289 Hier à 17:44
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
if [[ $Label =~ $rgx || ${#Label} -gt 16 ]]
les guillemets sont inutiles entre [[ ]], et encore plus avec des nombres; et avec case aussi.
pour ne pas avoir à unset les différentes Rep, Rep2 et 3, on pourrait utiliser la variable par défaut ($REPLY), qui sera réinitialisée à chaque read
Dernière modification par Watael (Hier à 17:45)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#290 Hier à 20:23
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Au vu des deux dernières remarques de Watael :
#!/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
label() {
local rgx="[^[:alnum:]_-]"
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 3
fi
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp="$(grep $Label /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case $REPLY in
N|n)
echo "Annulation par l’utilisateur !"
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.
break
;;
*)
;;
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 2
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 true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case $REPLY in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
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 « $Label » ? [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 !"
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 4
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 5
fi
break
;;
*)
;;
esac
done
Ou en 80 colonnes :
#!/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
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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 true
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
case $REPLY in
N|n)
echo "Annulation par l’utilisateur !"
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
break
;;
*)
;;
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 true
do
echo -n "Voulez-vous changer l’étiquette "
echo -n "de la partition « $Part » ? [O/n] "
read -r
case $REPLY in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true
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
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 !"
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
break
;;
*)
;;
esac
done
À tester dans tous les sens.
Dernière modification par nany (Hier à 21:54)
En ligne
#291 Hier à 20:38
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour , oulaha la la ! vous vous êtes énervés
Cette semaine , je vais pas trop avoir le temps de regarder , ni de tester ...
Des que j' ai un peu de temps , je regarde ça de pres , car y a pas mal de choses a regarder , mais au final ca ne change que peu de choses si j' ai bien compris .
C' est beaucoup plus simple de gérer ça au cas par cas que d ' en faire un script cette histoire ...
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#292 Hier à 21:40
- tycooon
Re : [ SCRIPT ] pour montage automatique partitions internes
bonjour
petite erreur (oubli)
line 92: ((: 16 = 0 : attempted assignment to non-variable (error token is "= 0 ")
if (( ${#ListPart[@]} == 0 )); then
piqué dans le script précédant
Hors ligne
#293 Hier à 21:56
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Oups !
Merci tycooon.
Corrigé dans le message #290.
En ligne
#294 Hier à 23:51
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
Bon, j’ai passé les deux versions dans ShellCheck.
Donc, après avoir suivi ses conseils :
#!/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
label() {
local rgx="[^[:alnum:]_-]"
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 3
fi
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
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 && $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
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
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
elif [ -n "$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.
break
;;
*)
;;
esac
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)"
exit 1
fi
declare -A ListPart
eval $(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 '$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+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 true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
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 « $Label » ? [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 !"
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 4
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 5
fi
break
;;
*)
;;
esac
done
Ou (80 colonnes) :
#!/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
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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
mp=$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)
while true
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
case $REPLY in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
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 && $pmp =~ $rgx ]]
then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
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
elif [[ -d $mp && $mp =~ $rgx ]]
then
rmdir -v "$mp"
elif [ -n "$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
break
;;
*)
;;
esac
done
}
if ((UID))
then
echo -n "Vous devez être super utilisateur pour lancer ce script "
echo "(essayez avec « sudo »)."
exit 1
fi
declare -A ListPart
eval $(lsblk -no path,fstype,mountpoint,label |
awk -v i=-1 '$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 true
do
echo -n "Voulez-vous changer l’étiquette "
echo -n "de la partition « $Part » ? [O/n] "
read -r
case $REPLY in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true
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
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 !"
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 "
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,"
echo -n "nofail,x-systemd.device-timeout=1,x-gvfs-show,"
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"
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 -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
break
;;
*)
;;
esac
done
(Ça ne va pas faire plaisir à Watael : y a un eval.)
[edit]Et je me rends compte seulement maintenant que j’avais laissé des redirections d’erreurs dans /dev/null.[/edit]
Dernière modification par nany (Aujourd'hui à 04:34)
En ligne
#295 Aujourd'hui à 08:49
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
eval qui n'est pas indispensable, et qui est redondant avec la Substitution de commandes; ça marchait bien sans, non ?
et puis on n'en a pas besoin :
declare -A ListPart
declare -A Rgx=(
[fstype]='^(ext[2-4]|ntfs|vfat)'
[mountP]='^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$'
)
i=-1
while read -ra lsblkDT #path fstype mountP label
do
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]=${lsbklDT[2]}
ListPart[$i,3]=${lsblkDT[3]}
else
ListPart[$i,2]='' #en a-t-on vraiment besoin ?
ListPart[$i,3]=${lsblkDT[2]}
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label)
si je ne me suis pas trompé...
Dernière modification par Watael (Aujourd'hui à 09:03)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#296 Aujourd'hui à 11:20
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
eval qui n'est pas indispensable, et qui est redondant avec la Substitution de commandes; ça marchait bien sans, non ?
Oui, ça marchait sans mais,
SC2091 (warning): Remove surrounding $() to avoid executing output (or use eval if intentional).
Bon, j’ai juste lu use eval if intentional sans cliquer sur le lien.
et puis on n'en a pas besoin :
…
Je me doutais bien que tu trouverais autre chose.
si je ne me suis pas trompé...
Presque. Je ne sais pas pourquoi mais le mountpoint n’était pas récupéré. Il a fallu quoter ${lsblkDT[3]} (ou ${lsblkDT[2]} selon le cas) alors du coup j’ai tout quoté (ShellCheck acceptant les deux cas) :
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 #path fstype mountpoint label
do
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)
(Ah oui, vfat est exclu de la recherche et on a vraiment besoin de la ligne ListPart[$i,2]="".)
En ligne
#297 Aujourd'hui à 11:31
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
ah! le vfat, c'est parce que j'ai fait les tests avec une simple clé USB; j'ai oublié de l'effacer à la copie.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#298 Aujourd'hui à 11:37
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
if ! [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]
then
((++i))
...
pas besoin du continue : en shell on peut facilement "nier" un test, contrairement à awk.
Dernière modification par Watael (Aujourd'hui à 11:37)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#299 Aujourd'hui à 11:44
- nany
Re : [ SCRIPT ] pour montage automatique partitions internes
OK.
Alors voici les dernières moutures :
#!/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
label() {
local rgx="[^[:alnum:]_-]"
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 3
fi
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
local mp
mp="$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)"
while true; 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] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
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 && $pmp =~ $rgx ]]; then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
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
elif [[ -d $mp && $mp =~ $rgx ]]; then
rmdir -v "$mp"
elif [ -n "$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.
break
;;
*)
;;
esac
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 #path fstype mountpoint label
do
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
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 true; do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [O/n] "
case "$REPLY" in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
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 « $Label » ? [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 !"
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 4
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 5
fi
break
;;
*)
;;
esac
done
En 80 colonnes :
#!/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
# ----------------------------------------------------------------------------
LC_ALL=C
label() {
local rgx="[^[:alnum:]_-]"
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
mp=$(grep "$Label" /etc/fstab | cut -d ' ' -f 2)
while true
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
case $REPLY in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
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 && $pmp =~ $rgx ]]
then
rmdir -v "$pmp"
else
echo "$pmp n’a pas été supprimé."
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
elif [[ -d $mp && $mp =~ $rgx ]]
then
rmdir -v "$mp"
elif [ -n "$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
break
;;
*)
;;
esac
done
}
if ((UID))
then
echo -n "Vous devez être super utilisateur pour lancer ce script "
echo "(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 #path fstype mountpoint label
do
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
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 true
do
echo -n "Voulez-vous changer l’étiquette "
echo -n "de la partition « $Part » ? [O/n] "
read -r
case $REPLY in
N|n)
Label="$PartLabel"
break
;;
Y|y|O|o|"")
label
break
;;
*)
;;
esac
done
fi
while true
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
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 !"
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 "
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,"
echo -n "nofail,x-systemd.device-timeout=1,x-gvfs-show,"
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"
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 -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
break
;;
*)
;;
esac
done
En ligne
#300 Aujourd'hui à 18:39
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Bonjour , ouarf , on ne vous arrête plus
on peut mettre un " elif " sans d' abord avoir un " if " ???
ligne 56 a 59 .
Pourquoi inclure dans le case de la fonction " unmount " , un cas par défaut , qui ne fait rien ?
ha ba oui , y a eu d' autres modifs , et donc comme on ne traite que le cas oui et non , il faut ajouter le " reste " .
Ha , ya plus le AWK , mais bon , c' est toujours aussi simple
while read -ra lsblkDT #path fstype mountpoint label
do
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)
Quoi que , en fait si ça va . Hors mis les " < < " , qu' est ce que cella fait en français ?
un test au pif :
umount: /media/iznobe/test (/dev/nvme0n1p12) démonté
/media/iznobe/test n’a pas été supprimé.
mkdir: création du répertoire '/media/moi'
mkdir: création du répertoire '/media/moi/iznobe-moi'
appartenance de '/media/moi/iznobe-moi' modifiée de root:root en iznobe:iznobe-----------------------------------------------------------------
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/moi/iznobe-moi ».
iznobe@iznobe-PC:~/Scripts$
c' est voulu ?
Dernière modification par iznobe (Aujourd'hui à 19:37)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne