#326 Hier à 10:33
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Salut watael , voici :
iznobe@k-pi3:~ $ mapfile -t labels < <(lsblk -no label)
for i in ${!labels[@]}; do echo "$i - ${labels[i]}"; done
0 -
1 - bootfs
2 - rootfs
3 - mpoil
4 -
iznobe@k-pi3:~ $
Donc il faudrait mettre :
mapfile -t labels < <(lsblk -no label)
if [ -n "${!labels[0]}" ]; then
for lab in "${!labels[@]}"; do
echo "$lab=$newLabel"
if [[ "$lab" == "$newLabel" ]]; then
echo "OK"
unset newLabel
break
fi
done
fi
?
quand meme , c' est pas tres intuitif cette histoire
je testerai mieux en rentrant chez moi . le principal etant que cela fonctionne , mais une idée de pourquoi ? :
"${!labels[@]}"
alors que pour les autres tableaux ce n' est pas necessaire , C' est lié à la sortie de la commande lsblk ?
Dernière modification par iznobe (Hier à 10:44)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#327 Hier à 12:39
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Suite aux indications de @Watael , et la prise en charge de points de montages multiples dans le fstab , voici le dernier 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
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
mapfile -t labels < <(lsblk -no label)
for i in "${!labels[@]}"; do
if [[ "${labels[i]}" == "$newLabel" ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
unset newLabel
break
fi
done
done
}
unmount() {
local rgx="^(/mnt/|/media/).+$"
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 « $newLabel » ? [O/n] "
case "$REPLY" in
N|n)
echo "Annulation par l’utilisateur !"
exit 0
;;
Y|y|O|o|"")
# 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
sed -i "/$(lsblk -no uuid "$Part")/d" /etc/fstab
fi
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; 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]}"
#umount -v /media/"$PartLabel"
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 !"
elif grep -Eq "(LABEL=|/dev/disk/by-label/)$newLabel" /etc/fstab; then
echo "L’étiquette « $newLabel » est déjà utilisée dans le fstab !"
elif grep -q "^$Part" /etc/mtab; then
echo "La partition « $Part » est déjà montée !"
fi
unmount
# 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 »."
xdg-open "/media/$newLabel/$SUDO_USER-$newLabel"
else
echo "Erreur inconnue !"
exit 4
fi
break
;;
*)
;;
esac
done
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#328 Hier à 13:18
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
je n'ai pas dit de l'intégrer au code, je t'ai demandé de nous faire voir le résultat.
il apparaît, comme on le savait déjà (et puis on a oublié ), que certaines partitions n'ont pas de LABEL.
si on ne peut donc pas se fier à ${label[0]} pour tester que le tableau comporte des éléments, on doit se rabattre à tester le nombre des éléments du tableau; encore que, comme je te l'ai dit, on peut se passer du test en définissant nullglob.
Cependant, la boucle for va potentiellement itérer sur des éléments vides ! ...
[ajout]
Mais, la liste des labels existe déjà !
for i in ${!ListPart[*]}; do if [[ $i == *,3 && ${ListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi; done
d'ailleurs, nany a numéroté les "champs", mais ce n'est pas obligatoire, on aurait pu avoir des noms de "champs" plus explicites :
((++i))
ListPart[$i,path]="${lsblkDT[0]}"
ListPart[$i,mPoint]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,fsType]="${lsblkDT[2]}"
ListPart[$i,label]="${lsblkDT[3]}"
#...
la boucle du dessus deviendrait :
for i in ${!ListPart[*]}; do if [[ $i == *,label && ${ListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi;done
edit: correction lListPart -> ListPart
Dernière modification par Watael (Hier à 13:58)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#329 Hier à 13:37
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
[ajout]
Mais, la liste des labels existe déjà !for i in ${!ListPart[*]}; do if [[ $i == *,3 && ${lListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi;done
la boucle du dessus deviendrait :
for i in ${!ListPart[*]}; do if [[ $i == *,label && ${lListPart[$i]} == "$newLabel" ]]; then echo "« $newLabel » existe déjà"; fi;done
marche pas :
for i in ${!ListPart[*]}; do
if [[ $i == *,label && ${lListPart[$i]} == "$newLabel" ]]; then
echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
fi
done
# mapfile -t labels < <(lsblk -no label)
# for i in "${!labels[@]}"; do
# if [[ "${labels[i]}" == "$newLabel" ]]; then
# echo "Erreur, votre étiquette « $newLabel » est déjà attribuée ! Choisissez-en une autre."
# unset newLabel
# break
# fi
# done
done :
Choisissez le numéro correspondant à votre future partition de données : 16
La partition « /dev/nvme0n1p12 » a l’étiquette « test ».
Voulez-vous changer l’étiquette de la partition « /dev/nvme0n1p12 » ? [O/n]
Choisissez l’étiquette (LABEL) de votre partition de données, elle doit être UNIQUE et ne pas contenir d’espace, d’accent, de caractères spéciaux et au maximum 16 caractères : test
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « test » ? [O/n]
Dernière modification par iznobe (Hier à 13:47)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#330 Hier à 13:56
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
ceci marche à priori :
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
un " l " en trop dans :
${lListPart[$i]}
Dernière modification par iznobe (Hier à 13:57)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#331 Hier à 13:56
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
pour que ça ([[ $i == *,label) fonctionne, il faut avoir fait ça
((++i))
ListPart[$i,path]="${lsblkDT[0]}"
ListPart[$i,mPoint]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,fsType]="${lsblkDT[2]}"
ListPart[$i,label]="${lsblkDT[3]}"
#...
pour toutes les affectations de ListPart (d'où le #...).
et puis il y a une coquille ici : ${lListPart
je corrige.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#332 Hier à 14:01
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
j ' avais bien compris , mais comme la premiere boucle ne marchait pas , je me suis disque j' allais tester avec la 2eme ...
et ca ne marchait pas plus
oui , j ' ai vu pour la coquille .
bon , je renvoie le code dans le github c ' est bon pour toi ? je modifie dans le 1er post .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#333 Hier à 14:06
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
sinon , on peut utiliser le " . " normalement pour les étiquettes non ? car il n' est pas compris dans la regex .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#334 Hier à 14:17
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
heu, non. d'après la regex [^[:alnum:]_-], le point n'est pas un caractère valide.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#335 Hier à 14:22
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
oui , c' est ce que je dis .
Mais je ne trouve pas sur le net , un document de référence qui donne les caractères que l ' on peut utiliser sans risque pour mettre dans un " label "
peut être que le " . " est valide et qu ' on devrait l ' inclure dans la regex .
Dernière modification par iznobe (Hier à 14:26)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#336 Hier à 16:01
- tycooon
Re : [ SCRIPT ] pour montage automatique partitions internes
oups !! ça fonctionne, mais beaucoup d'erreur au montage avec mon environnement avec nautilus.
$ sudo ./montage
[sudo] Mot de passe de olivier :
n° ⇒ path label fstype mountpoint
--------------------------------------------
1 ⇒ /dev/sda1 backup ext4 /media/olivier/backup
2 ⇒ /dev/sdb3 sauvegarde ntfs /media/sauvegarde
3 ⇒ /dev/nvme0n1p2 ntfs
4 ⇒ /dev/nvme0n1p3 ntfs
Choisissez le numéro correspondant à votre future partition de données : 2
La partition « /dev/sdb3 » a l’étiquette « sauvegarde ».
Voulez-vous changer l’étiquette de la partition « /dev/sdb3 » ? [O/n] n
Voulez-vous procéder au montage maintenant pour la partition « /dev/sdb3 » en y mettant pour étiquette « sauvegarde » ? [O/n] o
L’étiquette « sauvegarde » est déjà utilisée dans le fstab !
Voulez-vous démonter la partition « /dev/sdb3 » de son emplacement actuel et procéder aux changements pour la monter avec l'étiquette « sauvegarde » ? [O/n] o
umount: /media/sauvegarde (/dev/sdb3) démonté
rmdir: suppression du répertoire, '/media/sauvegarde'
mkdir: création du répertoire '/media/sauvegarde'
-----------------------------------------------------------------
Script pour montage de partition de données terminé avec succès !
Vous pouvez maintenant accéder à votre partition en parcourant le dossier suivant : « /media/sauvegarde/olivier-sauvegarde ».
** (org.gnome.Nautilus:37600): WARNING **: 15:52:27.397:
========================================================
Cette application ne peut pas fonctionner correctement
si exécutée en tant que racine (pas même avec sudo).
Envisagez d’exécuter `nautilus admin:/` à la place.
========================================================
** Message: 15:52:34.420: Connecting to org.freedesktop.Tracker3.Miner.Files
Initializing nautilus-image-converter extension
(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.620: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.620: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.620: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): libunity-CRITICAL **: 15:52:34.627: file unity-launcher.c: line 1638: unexpected error: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom) (g-exec-error-quark, 8)
(org.gnome.Nautilus:37600): libunity-CRITICAL **: 15:52:34.627: unity_launcher_entry_dbus_impl_construct: assertion 'conn != NULL' failed
(org.gnome.Nautilus:37600): libunity-CRITICAL **: 15:52:34.631: unity-inspector.vala:96: Unable to connect to session bus: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): Gtk-WARNING **: 15:52:34.636: Unable to acquire session bus: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.702: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.702: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): GLib-GIO-CRITICAL **: 15:52:34.742: g_dbus_proxy_call_internal: assertion 'G_IS_DBUS_PROXY (proxy)' failed
(org.gnome.Nautilus:37600): GLib-GIO-CRITICAL **: 15:52:34.742: g_dbus_proxy_get_connection: assertion 'G_IS_DBUS_PROXY (proxy)' failed
(org.gnome.Nautilus:37600): GLib-GIO-CRITICAL **: 15:52:34.742: g_dbus_connection_signal_subscribe: assertion 'G_IS_DBUS_CONNECTION (connection)' failed
** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Error creating proxy L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Error creating proxy L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Error creating proxy L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.742: Unable to create connection for session-wide Tracker indexer: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.756: Unable to get contents of the bookmarks file: Erreur lors de l’ouverture du fichier /root/.gtk-bookmarks : Aucun fichier ou dossier de ce nom
** (org.gnome.Nautilus:37600): WARNING **: 15:52:34.757: Unable to get contents of the bookmarks file: Erreur lors de l’ouverture du fichier /root/.gtk-bookmarks : Aucun fichier ou dossier de ce nom
(org.gnome.Nautilus:37600): nautilus-application-CRITICAL **: 15:52:34.823: update_dbus_opened_locations: assertion 'dbus_object_path' failed
(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:34.823: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
(org.gnome.Nautilus:37600): dconf-WARNING **: 15:52:48.172: failed to commit changes to dconf: L’exécution du processus fils « dbus-launch » a échoué (Aucun fichier ou dossier de ce nom)
il ne doit pas aimer cette ligne ????
xdg-open "/media/$newLabel/$SUDO_USER-$newLabel"
Hors ligne
#337 Hier à 16:25
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
Salut @tycooon , il n ' y a que cela comme erreurs ?
bon , je supprime la ligne .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#338 Hier à 16:37
- tycooon
Re : [ SCRIPT ] pour montage automatique partitions internes
bon j'ai trouvé le problème c'est le sudo
sudo xdg-open "/media/sauvegarde/olivier-sauvegarde"
[sudo] Mot de passe de olivier :
** (org.gnome.Nautilus:40453): WARNING **: 16:33:47.221:
========================================================
Cette application ne peut pas fonctionner correctement
si exécutée en tant que racine (pas même avec sudo).
Envisagez d’exécuter `nautilus admin:/` à la place.
========================================================
sans le sudo ça fonctionne
xdg-open "/media/sauvegarde/olivier-sauvegarde"
Mais comme le script est lancé avec le sudo, j'ai les messages d'erreur
Hors ligne
#339 Hier à 17:12
- tycooon
Re : [ SCRIPT ] pour montage automatique partitions internes
si tu tiens vraiment à ouvrir l'interface graphique, ceci fonctionne sans erreur
sudo -u "$SUDO_USER" xdg-open "/media/$newLabel/$SUDO_USER-$newLabel" >/dev/null 2>&1 &
Bon Ok, j'ai pas trouvé tout seul
Hors ligne
#340 Hier à 17:26
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
je suis pas sur que l' esperluette à la fin de la commande soit nécessaire .
je trouvais que ça faisait quand même plus classe d ' ouvrir le dossier en question à la fin , du coup j ' ajoute la nouvelle ligne , sans le dernier " & " .
Merci
Dernière modification par iznobe (Hier à 17:31)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#341 Hier à 17:44
- erresse
Re : [ SCRIPT ] pour montage automatique partitions internes
Hello,
Autant que je sache, la variable "$SUDO_USER" est utile pour connaître le nom de l'utilisateur qui exécute le script lorsque ce dernier est lancé avec "sudo". Sans cela, la variable "$USER" renvoie "root" et non l'utilisateur.
Donc, si le script de iznobe est bien exécuté avec "sudo" au lancement, il est indispensable d'utiliser "$SUDO_USER" pour pouvoir identifier correctement l'utilisateur.
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#342 Hier à 17:54
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
suppression de unmount() : une fonction est vraiment utile pour du code qui se répète
# traitement des partitions montées
mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2)
delMountPoint mountedParts
# traitement des partitions NON montées
mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoint 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.
avec delMountPoint telle que :
delMountPoint()
{
local rgx="^(/mnt/|/media/).+$"
declare -na 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
}
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#343 Hier à 18:10
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
ok , une fonction a un paramètre .
bon là , j' en ai un peu ras le bol ... , mais c' était ma future question de toute manière , tu m' as devancé
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#344 Aujourd'hui à 05:13
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
j'ai mis "un peu" le nez dans l'ensemble du script. Ça ne me paraît pas très cohérent :
on définit des variables
on choisit une partition
on définit un nouveau label
jusque là, ça va
et puis ça devient chaotique :
on demande si on veut monter la partition, alors qu'on ne sait pas si elle est démontée
puis si on veut démonter la partition, alors qu'on ne sait pas si elle est montée
on remonte toutes les partitions
et après, j'ai les yeux qui brûlent : trop de ; et de "
à cette heure, j'en suis là :
#!/bin/bash
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script (essayez avec « sudo »)."
exit 1
fi
LC_ALL=C
shopt -s nullglob
choixLabel() {
while [ -z "$newLabel" ]
do
echo "L’étiquette (LABEL) de votre partition de données doit être UNIQUE"
echo "ne pas contenir ni espace, ni accent, ni caractères spéciaux"
echo "et doit comporter 16 caractères macimum."
read -rp 'Quel nom souhaitez-vous donner à votre partition ? '
if [[ $REPLY =~ ${Rgx[label]} ]]
then
echo "Votre étiquette comporte
* une espace, ou
* un accent, ou
* un caractère spécial."
continue
elif (( ${#REPLY} > 16 ))
then
echo "Votre étiquette comporte plus de 16 caractères."
continue
else
for i in ${!ListPart[*]}; do
if [[ $i == *,label && ${ListPart[$i]} == $REPLY ]]; then
echo "Erreur: le nom « $REPLY » est déjà attribué ! Choisissez-en une autre."
continue 2
fi
done
fi
newLabel=$REPLY
done
}
delMountPoint()
{
declare -na mountPoints
for mountPoint in "${mountPoints[@]}"
do
if test "$1" = 'mountedPoints'; then umount -v "$mountPoint"; fi
if [ -d "$mountPoint" ]
then
if [[ $mountPoint =~ ${Rgx[unmount]} ]]; then
rmdir -v "$mountPoint"
else
echo "$mountPoint a été conservé."
fi
fi
mapfile -t numLines < <(grep -n "$mountPoint" /etc/fstab | cut -d ":" -f 1 | sort -rn)
for n in "${numLines[@]}"; do
sed -i "${n}d" /etc/fstab
done
done
}
# définition de variables
declare -i i=-1 nbDev partNum
declare -A Rgx=(
[fstype]="^(ext[2-4]|ntfs)"
[label]="[^[:alnum:]_-.]"
[mountP]="^(/|/boot|/home|/tmp|/usr|/var|/srv|/opt|/usr/local)$"
[unmount]="^(/mnt/|/media/).+$"
)
declare -A ListPart
while read -ra lsblkDT
do
if [[ ${lsblkDT[1]} =~ ${Rgx[fstype]} ]]
then
if ! [[ ${lsblkDT[2]} =~ ${Rgx[mountP]} ]]
then
((++i , ++nbDev))
ListPart[$i,path]="${lsblkDT[0]}"
ListPart[$i,fstype]="${lsblkDT[1]}"
if [[ ${lsblkDT[2]} =~ ^/ ]]; then
ListPart[$i,mountpoint]="${lsblkDT[2]}"
ListPart[$i,label]="${lsblkDT[3]}"
else
ListPart[$i,mountpoint]=""
ListPart[$i,label]="${lsblkDT[2]}"
fi
fi
fi
done < <(lsblk -no path,fstype,mountpoint,label --filter 'path !~ ".*/sd[[:alpha:]]$"') #pour pas voir les disques.
if ((nbDev)); then
echo "Il n’y a pas de partition susceptible d’être montée."
exit 2
fi
# Sélection de la partition à traiter
# affichage des partitions
echo
echo " n° : path label fstype mountpoint"
echo "--------------------------------------------"
for (( n=0; n<nbDev; n++ )); do
printf '%2d : %s %s %s %s\n' $((n+1)) "${ListPart[$n,path]}" "${ListPart[$n,label]}" "${ListPart[$n,fstype]}" "${ListPart[$n,mountpoint]}"
done
echo
# sélection d'une partition
while (( 0 >= partNum || partNum > nbDev ))
do
((err)) && echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
read -rp "Chosissez le numéro correspondant à votre future partition de données : " partNum
err=1
done
partNum-=1
Part="${ListPart[$partNum,path]}"
PartLabel="${ListPart[$partNum,label]}"
PartFstype="${ListPart[$partNum,fstype]}"
# définition d'un nouveau LABEL
if [ -z "$PartLabel" ]
then
echo "La partition « $Part » n’a pas d’étiquette."
choixLabel
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while :
do
read -rp "Voulez-vous changer l’étiquette de la partition « $Part » ? [o|N] " #par défaut, si l'utilisateur ne répond pas explicitement "oui", on ne change rien.
if [[ $REPLY == [YyOo] ]]
then
choixLabel
else
newLabel="$PartLabel"
fi
break
done
fi
# Avertissements
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"
fi
if 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"
fi
if 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 nettoyé , et la partition sera à nouveau montée si vous poursuivez"
fi
#SOUHAITEZ-VOUS POURSUIVRE ?
#...
#VOUS ÊTES SÛR DE VOULOIR EFFECTUER LES MODIFICATIONS ?
#VOUS NE POURREZ PAS EFFACER LES MODIFICATIONS. automatiquement
#...
#
# à partir de là, toutes les demandes de confirmation peuvent être supprimées.
#
# démontage
# traitement des partitions montées #Vérifier qu'elle est montée
mapfile -t mountedPoints < <(grep "^$Part" /etc/mtab | cut -d " " -f 2)
delMountPoint mountedPoints
# traitement des partitions NON montées #Vérifier qu'elle est dans fstab
mapfile -t notMountedPoints < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2)
delMountPoints notMountedPoints
sed -i"$(date +'_%F_%T.%N')" "/$(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.
# mise à jour de fstab
if [[ $PartFstype =~ ext[2-4] ]]
then
labelizer=$(which e2label)
add2fstab="LABEL=$newLabel /media/$newLabel $PartFstype defaults,nofail,x-systemd.device-timeout=1"
elif [ "$PartFstype" == "ntfs" ]; then
labelizer=$(which ntfslabel)
add2fstab="LABEL=$newLabel /media/$newLabel ntfs3 defaults,nofail,x-systemd.device-timeout=1,x-gvfs-show,nohidden,uid=$SUDO_UID,gid=$SUDO_GID"
fi
$labelizer "$Part" "$newLabel"
cp /etc/fstab{,$(date +'_%F_%T.%N')}
echo "$add2fstab" >>/etc/fstab
# construction des éléments ?
if ! [ -d "/media/$newLabel" ]
then
mkdir -v "/media/$newLabel"
fi
#remontage des partitions inscrites dans dstab
systemctl daemon-reload
if ! mount -a
then
echo "erreur innatendue , annulation des modifications !"
rmdir -v "/media/$newLabel"
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
Dernière modification par Watael (Aujourd'hui à 06:18)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#345 Aujourd'hui à 05:57
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
heu , j ' ai l ' impression que le petit poucet a perdu ses miettes de pains .
l ' objectif du script : on choisit une partition que l' on va montée avec un LABEL précis quoi qu ' il arrive .
le déroulement du script c' est plutôt ( tout simplement ) :
on liste l ' ensemble des partitions modifiables et on en recueille les données .
on demande à l' utilisateur de choisir laquelle il veut traiter
on demande à l' utilisateur quel label il veut y mettre
on demande à l' utilisateur confirmation que les données entrées sont celles qu ' il veut avant de traiter
on traite ( et on avertit le cas échéant de ce qu ' il peut se passer lors du script en fonction de l' état du fstab , des montages en places , et je sais plus tant quoi d' autre ) .
je ne sais pas ou tu as vu :
on demande si on veut monter la partition, alors qu'on ne sait pas si elle est démontée
puis si on veut démonter la partition, alors qu'on ne sait pas si elle est montée
on remonte toutes les partitions
Dernière modification par iznobe (Aujourd'hui à 06:01)
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#346 Aujourd'hui à 06:23
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
ta fonction unmount le masque.
remplace l'appel de la fonction par son code, tu le verras aussi.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#347 Aujourd'hui à 06:31
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
oui , je suis d' accord avec toi sur ce point , d ' ou la question que tu m' as devancé .
il faut preciser , que jusqu ' a il y a peu , à la palce de :
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"
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"
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"
fi
unmount
# construction des éléments :
...
je faisais :
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"
unmount
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"
unmount
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"
unmount
fi
# construction des éléments :
...
Mais ca ne traitait pas dans tous les cas a priori .
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#348 Aujourd'hui à 06:32
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
ça aussi ça va pas :
sed -i"$(date +'_%F_%T.%N')" "/$(lsblk -no uuid "$Part")/d" /etc/fstab
puisque tu réécris la table des partitions avec des LABEL, et pas des UUID, la prochaine fois /etc/fstab ne sera pas mis à jour.
Dernière modification par Watael (Aujourd'hui à 06:32)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#349 Aujourd'hui à 06:41
- Watael
Re : [ SCRIPT ] pour montage automatique partitions internes
comme je l'ai écrit dans le script, il y a trop de confirmations et d'exécutions partielles.
il vaut mieux deux confirmations successives (la seconde étant plus "impérieuse"), et faire tout ce qu'il y a à faire d'une traite.
donc,
recueil des informations (état et modifications souhaitées)
affichage de l'état avant
affichage de l'état prévu
confirmation
CONFIRMATION
exécution
affichage de l'état après
et pour pouvoir revenir en arrière (au moins manuellement), il faut garder autant de traces que possible de l'état de la machine (sauvegarder mtab) et des fichiers qui seront modifiés (sauvegarder fstab), avant chaque modification.
Dernière modification par Watael (Aujourd'hui à 06:48)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#350 Aujourd'hui à 07:25
- iznobe
Re : [ SCRIPT ] pour montage automatique partitions internes
suppression de unmount() : une fonction est vraiment utile pour du code qui se répète
# traitement des partitions montées mapfile -t mountedParts < <(grep "$Part" /etc/mtab | cut -d ' ' -f 2) delMountPoint mountedParts # traitement des partitions NON montées mapfile -t unmountedParts < <(grep -E "^(LABEL=|/dev/disk/by-label/)$PartLabel" /etc/fstab | cut -d ' ' -f 2) delMountPoint 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.
avec delMountPoint telle que :
delMountPoint() { local rgx="^(/mnt/|/media/).+$" declare -na 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 }
sur le papier la fonction delMountPoint avait l' air sympa , mais :
Voulez-vous procéder au montage maintenant pour la partition « /dev/nvme0n1p12 » en y mettant pour étiquette « tes » ? [O/n]
L’étiquette « tes » est déjà utilisée dans le fstab !
les lignes contenant ce LABEL seront supprimées du fichier /etc/fstab si vous poursuivez
sauvegarde du fichier « /etc/fstab » en « /etc/fstab.BaK » avant modifications
automount_part_data.sh: line 34: declare: parts: reference variable cannot be an array
automount_part_data.sh: line 34: declare: parts: reference variable cannot be an array
Cannot make changes to a mounted device
mkdir: création du répertoire '/media/tes'
mkdir: création du répertoire '/media/tes/iznobe-tes'
appartenance de '/media/tes/iznobe-tes' modifiée de root:root en iznobe:iznobe
mkdir: création du répertoire '/media/tes/.Trash-1000'
appartenance de '/media/tes/.Trash-1000' modifiée de root:root en iznobe:iznobe
le mode de '/media/tes/.Trash-1000' a été modifié de 0755 (rwxr-xr-x) en 0700 (rwx------)
-----------------------------------------------------------------
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/tes/iznobe-tes ».
iznobe@iznobe-pc:~/Scripts$
retour COMPLET et utilisable de commande | script montage partitions
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne