Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#51 Le 10/03/2025, à 16:40

iznobe

Re : script pour montage automatique partitions de données

alors , j ' ai fait ca pour éviter les doublons , le cas échéant au lieu de directement ajouté une ligne dans fstab :

LineOccur=$(grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab) # echo $? : trouve pas retourne 1 , trouve retourne 0
            if [[ "$(echo "$?")" == "0" ]]; then 
            else
                echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
            fi

ca me parait bien plus simple que les autres solutions au final . a coder et à élaborer tongue

En gros : si la ligne qu ' on compte ajouter existe déjà , et bien on n ' ajoute rien au fstab , sinon , on l' ajoute .
Par contre , ca me fait sortir une variable pour rien , comme je l' ai écrit ... c' est pas un script ou la nécessité de la performance est la priorité mais bon , là , c' est pas trop top j ' avoue , mais ca fonctionne parfaitement .



EDIT :
une partition peut etre montée plusieurs fois a plusieurs endroits , c ' est pas grave , par contre je ne sais pas comment reagit le systeme si on essaie de monter plusieurs fois au meme endroit , je vais donc modifier encore pour eviter ce genre de chose aussi .
Donc voici ce qu e j ' ai adopté pour les doublons du au script :

LineOccur=$(grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab) # echo $? : trouve pas retourne 1 , trouve retourne 0
            if [[ "$(echo "$(grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab)")" == "0" ]]; then 
				echo "la partition est deja traitée dans le fichier /etc/fstab , rien n' a donc été modifié dans ce fichier "
            else
                echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
				mount -a 2>/dev/null
				systemctl daemon-reload
			fi

desolé pour l ' indentation , je suis pas sous ubuntu là mad

Dernière modification par iznobe (Le 10/03/2025, à 17:01)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#52 Le 10/03/2025, à 16:53

geole

Re : script pour montage automatique partitions de données

Oui mais si  on utilise le script pour modifier le label, cela signifie qu'il n'a pas cette valeur mais une autre. De plus la partition peut être montée sur /mnt/"UUID"  (Gnome disk utility)  et peut être définie par  UUID= ou /dev/disk/by-Label/LLLLLLL

Dernière modification par geole (Le 10/03/2025, à 16:57)


Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit,  utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir  https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248

Hors ligne

#53 Le 10/03/2025, à 17:07

iznobe

Re : script pour montage automatique partitions de données

tout à fait d' accord avec toi @geole .

Tout d' abord , ce script n' est pas censé modifier le label roll , il y a plein d' outils qui font cela gparted , peut être gnome-disque, et une commande spécifique " e2label " existe ....

si gnome disk utility a été utilisé , par expérience nous avons vu tous 2 plusieurs fois déjà , que c' est avec celui-ci qu ' il faut alors désactivé le montage automatique sous peine de rencontrer des bugs . je le suspecte d' écrire aussi ses modifications dans un autre fichier .

Bref , je ne vais pas m' engager dans ce script a " contrer " un autre logiciel hmm
si l' utilisateur l ' a utilisé pour monter , c' est aussi à lui de l' utiliser pour démonter le cas échéant ...
je ne peux pas prévoir tous les cas de figure , il va de soit que ce script est à faire sur une base " propre " .

Dernière modification par iznobe (Le 10/03/2025, à 17:10)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#54 Le 10/03/2025, à 17:40

lynn

Re : script pour montage automatique partitions de données

Là, ce n'est plus un marteau pour écraser la mouche mais une masse... tongue

if [[ "$(echo "$?")" == "0" ]]; then 

Un peu plus allégé :

if [ $? -eq 0 ]; then ...

ou

if (($?==0)); then ...

«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»

Coluche

Hors ligne

#55 Le 10/03/2025, à 18:01

iznobe

Re : script pour montage automatique partitions de données

il me semblait bien que c' etait un peu hard cette histoire tongue

Merci @lynn wink , je modifie .

Mais n ' y aurait il pas un moyen de faire directement le controle avec la commande dans la condition et  se passer de la variable LineOccur ?

Dernière modification par iznobe (Le 10/03/2025, à 18:06)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#56 Le 10/03/2025, à 18:16

iznobe

Re : script pour montage automatique partitions de données

@geole , je pourrais par contre inclure , quelques lignes pour vérifier si cette partition est deja inscrite via son label ou son UID dans le fstab  et indiquer à l' utilisateur si c' est le cas et arrêter le script , ca serait peut être pas plus mal ?

Dernière modification par iznobe (Le 10/03/2025, à 18:17)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#57 Le 10/03/2025, à 19:52

iznobe

Re : script pour montage automatique partitions de données

bon , ca commencer a devenir inbuvable ces if else dans tous les sens .

y a moyen d ' éclaircir encore ca , avec un switch case par exemple ?

#!/bin/bash

if ! id | grep -q "uid=0"; then
	echo "Vous devez etre super utilisateur pour lancer ce script ( essayez avec sudo )"
	exit 1
fi

while [ -z "$Disk" ]; do
	echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
	read Disk
done

while [ -z "$PartNum" ]; do	
	echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
	read PartNum
done

rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
	echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
	read Label
	
	if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]; then
    		Lab=${BASH_REMATCH[1]}
    		echo "Label : $Label | Lab : $Lab ."
    		if [[ "$Label" != "$Lab" ]]; then
    			echo "le nom de votre étiquette comporte un espace , un accent ou un caractère spécial !"
    			unset Label
    		fi
	else
		echo "le nom de votre étiquette comporte un trop grand nombre de caractères !"
		unset Label
	fi
done

while [ -z "$Rep" ]; do
	echo -n "Voulez-vous procéder au traitement maintenant pour la partition $Disk$PartNum [O/n] ?"
	read Rep
done

if [ "$Rep" = "n" ]; then
	echo -e "Annulation !"
	exit 2
	
else
	Bloc=/dev/"$Disk""$PartNum"
	# echo $? : trouve pas retourne 1 , trouve retourne 0
	
	if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien 
		echo -e "La partition $Bloc n' existe pas !"
		exit
	fi
	
	grep "$Bloc" /etc/mtab # verifier si la partition est deja montée
	if [ "$?" -eq 0 ]; then
		echo -e "La partition est déjà montée !"
		exit
	fi
	
	PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition	
	grep "$PartUUID" /etc/fstab # PartUUID est deja present dans fstab
	if [ "$?" -eq 0 ]; then
		echo -e "L UUID de la partition est déjà présent dans le fstab !"
		exit
	fi
	
	grep "$Label" /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
	if [ "$?" -eq 0 ]; then
		echo -e "L ' étiquette de la partition est déjà présente dans le fstab !"
		exit
	fi
	
	grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab # verifier si la ligne existe dans le fstab 
	if [ "$?" -eq 0 ]; then
		echo "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
		exit
	fi
	
	if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
		echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
		exit	
	else # construction des éléments :
        	e2label "$Bloc" "$Label"
		mkdir -v  /media/"$Label"
		echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
		mount -a 2>/dev/null
		systemctl daemon-reload
		mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
		chown -v "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
		mkdir /media/"$Label"/.Trash-"$SUDO_UID"
		chown -v "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
		chmod -v 700 /media/"$Label"/.Trash-"$SUDO_UID"
	
		echo " Script pour montage de partition de données terminé avec succès !"
	fi
fi

Dernière modification par iznobe (Le 10/03/2025, à 20:30)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#58 Le 10/03/2025, à 20:33

nany

Re : script pour montage automatique partitions de données

iznobe a écrit :

Mais n ' y aurait il pas un moyen de faire directement le controle avec la commande dans la condition et  se passer de la variable LineOccur ?

if grep -q "^LABEL=$Label" /etc/fstab ; then 
  echo "La partition est déjà traitée dans le fichier /etc/fstab, rien n'a donc été modifié dans ce fichier."
  exit
fi

Dernière modification par nany (Le 10/03/2025, à 20:36)

En ligne

#59 Le 10/03/2025, à 20:38

Watael

Re : script pour montage automatique partitions de données

y a moyen d ' eclaircir encore ca , avec un switch case :

non, parce que tu ne testes pas la même chose.

de plus, test "$(commande)" = 0 n'arrivera jamais, à moins que la commande affiche littéralement 0.
tu confonds ce qu'affiche une commande et son code de retour.
pour "tester" le code de retour d'une commande :

if commande
then
    : true
else
    : false
fi

c'est tout simple ! smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#60 Le 10/03/2025, à 20:51

iznobe

Re : script pour montage automatique partitions de données

Watael a écrit :

tu confonds ce qu'affiche une commande et son code de retour.

pas du tout je fais bien la difference ...

if commande
then
    : true
else
    : false
fi

cela merite peut etre un peu plus de contexte , c' est quoi " : true " ? comment je l' utilise , ca revient au meme que de faire :

if [ "$?" -eq 0 ]; then

d' ailleurs pourquoi c' est à l' envers , dans les autres langages , les booléens à ma connaissance c ' est 1 = true et 0 = false ...

Dernière modification par iznobe (Le 10/03/2025, à 20:53)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#61 Le 10/03/2025, à 20:57

iznobe

Re : script pour montage automatique partitions de données

nany a écrit :
iznobe a écrit :

Mais n ' y aurait il pas un moyen de faire directement le controle avec la commande dans la condition et  se passer de la variable LineOccur ?

if grep -q "^LABEL=$Label" /etc/fstab ; then 
  echo "La partition est déjà traitée dans le fichier /etc/fstab, rien n'a donc été modifié dans ce fichier."
  exit
fi

Merci nany wink
le " ^ "  a la meme signification que le " ! " ?
inverse , ou c' est encore autre chose ?

comme justement une " feinte " pour donner le code retour ?

Dernière modification par iznobe (Le 10/03/2025, à 21:00)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#62 Le 10/03/2025, à 21:04

nany

Re : script pour montage automatique partitions de données

iznobe a écrit :

inverse , ou c' est encore autre chose ?

C’est autre chose dans ce cas : ça indique le début de ligne.

En ligne

#63 Le 10/03/2025, à 21:16

iznobe

Re : script pour montage automatique partitions de données

bon , voilà ou ca en est , faut que je teste les derniers changements pour etre sur , mais on devrait etre pas trop mal et plus clair quand meme :

#!/bin/bash

if ! id | grep -q "uid=0"; then
	echo "Vous devez etre super utilisateur pour lancer ce script ( essayez avec sudo )"
	exit 1
fi

while [ -z "$Disk" ]; do
	echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
	read Disk
done

while [ -z "$PartNum" ]; do	
	echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
	read PartNum
done

rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
	echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
	read Label
	
	if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]; then
    		Lab=${BASH_REMATCH[1]}
    		echo "Label : $Label | Lab : $Lab ."
    		if [[ "$Label" != "$Lab" ]]; then
    			echo "le nom de votre étiquette comporte un espace , un accent ou un caractère spécial !"
    			unset Label
    		fi
	else
		echo "le nom de votre étiquette comporte un trop grand nombre de caractères !"
		unset Label
	fi
done

while [ -z "$Rep" ]; do
	echo -n "Voulez-vous procéder au traitement maintenant pour la partition $Disk$PartNum [O/n] ?"
	read Rep
done

if [ "$Rep" = "n" ]; then
	echo -e "Annulation !"
	exit 2
	
else
	Bloc=/dev/"$Disk""$PartNum"
	# echo $? : trouve pas retourne 1 , trouve retourne 0
	
	if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien 
		echo -e "La partition $Bloc n' existe pas !"
		exit
	fi
	
	if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
		echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
		exit
	fi
	
	if grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab 
		echo -e "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
		exit
	fi
		
	if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
		echo -e "La partition est déjà montée !"
		exit
	fi

	if grep -q "^LABEL=$Label" /etc/fstab; then  /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
		echo -e "L ' étiquette de la partition est déjà présente dans le fstab !"
		exit
	fi
	
	PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition	
	if grep -q "^$PartUUID" /etc/fstab; then # PartUUID est deja present dans fstab
		echo -e "L ' UUID de la partition est déjà présent dans le fstab !"
		exit	
		
	else # construction des éléments :
        	e2label "$Bloc" "$Label"
		mkdir -v  /media/"$Label"
		echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
		mount -a 2>/dev/null
		systemctl daemon-reload
		mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
		chown -v "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
		mkdir /media/"$Label"/.Trash-"$SUDO_UID"
		chown -v "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
		chmod -v 700 /media/"$Label"/.Trash-"$SUDO_UID"
	
		echo " Script pour montage de partition de données terminé avec succès !"
	fi
fi


merci pour l' explication @nany .

ca ne fonctionnera donc pas pour cet exemple-ci alors :

if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
		echo -e "La partition est déjà montée !"
		exit
	fi

?

Dernière modification par iznobe (Le 10/03/2025, à 21:19)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#64 Le 10/03/2025, à 21:25

Watael

Re : script pour montage automatique partitions de données

pas du tout je fais bien la difference ...

pas évident, parce ... ah! tu as modifé ton code.

tu n'utilises pas : true, big_smile c'était juste pour mettre quelque chose.

d' ailleurs pourquoi c' est à l' envers , dans les autres langages , les booléens à ma connaissance c ' est 1 = true et 0 = false ...

je ne sais pas.
cependant, il n'y a qu'un seul succès (0), mais plusieurs erreurs possibles (1<=ERR<=255)

"les autres langages", tu as des exemples ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#65 Le 10/03/2025, à 21:33

nany

Re : script pour montage automatique partitions de données

iznobe a écrit :

merci pour l' explication @nany .

ca ne fonctionnera donc pas pour cet exemple-ci alors :

if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
		echo -e "La partition est déjà montée !"
		exit
	fi

?

A priori si puisque $Bloc est censé être en début de ligne dans mtab.

En ligne

#66 Le 10/03/2025, à 22:05

Watael

Re : script pour montage automatique partitions de données

Bloc=/dev/$Disk$PartNum'servent à rien les guillemets.

l'arrêt d'un script par décision de l'utilisateur n'est pas une erreur => exit 0

le systemctl daemon-reload doit être effectué avant mount -a


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#67 Le 10/03/2025, à 22:22

iznobe

Re : script pour montage automatique partitions de données

Watael a écrit :

"les autres langages", tu as des exemples ?

en php , par exemple .

while (1) # = while (true )
{
echo $i;
$i ++;
}

donne une boucle infinie .


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#68 Le 10/03/2025, à 22:37

iznobe

Re : script pour montage automatique partitions de données

Voilà ce que ça dis , après les vos dernières remarques :
+ renumérotation des erreurs
+ suppression des " en trop tongue
+ correction des conditions
+ ajout des tests pour vérifier que la partition n' est pas déjà placée en fstab
+ inversion reload <=> mount -a

#!/bin/bash

if ! id | grep -q "uid=0"; then
	echo "Vous devez etre super utilisateur pour lancer ce script ( essayez avec sudo )"
	exit 1
fi

while [ -z "$Disk" ]; do
	echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
	read Disk
done

while [ -z "$PartNum" ]; do	
	echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
	read PartNum
done

rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
	echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
	read Label
	
	if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]; then
    		Lab=${BASH_REMATCH[1]}
    		echo "Label : $Label | Lab : $Lab ."
    		if [[ "$Label" != "$Lab" ]]; then
    			echo "le nom de votre étiquette comporte un espace , un accent ou un caractère spécial !"
    			unset Label
    		fi
	else
		echo "le nom de votre étiquette comporte un trop grand nombre de caractères !"
		unset Label
	fi
done

while [ -z "$Rep" ]; do
	echo -n "Voulez-vous procéder au traitement maintenant pour la partition $Disk$PartNum [O/n] ?"
	read Rep
done

if [ "$Rep" = "n" ]; then
	echo -e "Annulation !"
	exit 0
	
else
	Bloc=/dev/$Disk$PartNum
	# echo $? : trouve pas retourne 1 , trouve retourne 0
	
	if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien 
		echo -e "La partition $Bloc n' existe pas !"
		exit 1
	fi
	
	if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
		echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
		exit 2
	fi
	
	if grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab 
		echo -e "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
		exit 3
	fi
		
	if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
		echo -e "La partition est déjà montée !"
		exit 4
	fi

	grep "$Label" /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
	if [ "$?" -eq 0 ]; then
		echo -e "L ' étiquette de la partition est déjà utilisée dans le fstab !"
		exit 5
	fi
	
	PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition	
	grep "$PartUUID" /etc/fstab # PartUUID est deja present dans fstab
	if [ "$?" -eq 0 ]; then
		echo -e "L UUID de la partition est déjà présent dans le fstab !"
		exit 6
		
	else # construction des éléments :
        	e2label "$Bloc" "$Label"
		mkdir -v  /media/"$Label"
		echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
		systemctl daemon-reload
                mount -a 2>/dev/null
		mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
		chown -v "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
		mkdir /media/"$Label"/.Trash-"$SUDO_UID"
		chown -v "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
		chmod -v 700 /media/"$Label"/.Trash-"$SUDO_UID"
	
		echo " Script pour montage de partition de données terminé avec succès !"
	fi
fi

Dernière modification par iznobe (Le 10/03/2025, à 22:39)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#69 Le 10/03/2025, à 22:50

Watael

Re : script pour montage automatique partitions de données

iznobe a écrit :
Watael a écrit :

"les autres langages", tu as des exemples ?

en php , par exemple .

while (1) # = while (true )
{
echo $i;
$i ++;
}

donne une boucle infinie .

en shell aussi :

while ((1))

pourtant le code de retour des parenthèses est 0 :

((1)); echo $?
0

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#70 Le 10/03/2025, à 23:00

iznobe

Re : script pour montage automatique partitions de données

ok , donc pour les booléens , c' est pareil que dans les autres langages.

le code retour commande success est à 0 si true tongue et à autre si false ... faut que j' arrête les abus de langages , mais pas que , j ' ai l' impression big_smile big_smile

En tout cas , merci c' est quand même plus clair tout ca wink

Dernière modification par iznobe (Le 10/03/2025, à 23:01)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#71 Aujourd'hui à 14:30

RaphaelG

Re : script pour montage automatique partitions de données

Ah mince ! J'avais raté ce fil. Allez vite j'y vais de 2 petites remarques :

1) Avec la commande id, il y a l'option -u pour n'afficher que le user id.
Cela permet d'éviter un pipe grep au tout début de ton script.

if [ `id -u` != 0 ]
then
    echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
    exit 1
fi

On peut faire plus explicite avec l'option -n :

if [ `id -un` != "root" ]
then
    echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
    exit 1
fi

2) La regex :
La suggestion de sputnick de changer la variable locale LANG aurait du marcher.
Je maîtrise mal le motif [:alnum:] et je vais plutôt utiliser [0-9A-Za-z_-]+
A remarquer que le caractère moins, '-', n'a pas besoin d'être échappé; en le mettant juste devant le closing sqare bracket, bash sait qu'il ne définit pas un intervalle mais qu'il faut prendre sa valeur littérale.

#!/usr/bin/bash
langorigin=$LC_ALL
LC_ALL=C
rgx="([0-9A-Za-z_-]+)"
while [ -z "$Label" ]
do
    echo -n "Choisissez l'étiquette (LABEL) de votre partition de données (pas d'espace, d'accent ni de caractère spécial, 16 caractères maximum) "
    read Label
    if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]
    then
        Lab=${BASH_REMATCH[1]}
        echo "Label : $Label | Lab : $Lab ."
        if [[ "$Label" != "$Lab" ]]
        then
            echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial !"
            unset Label
        fi
    else
        echo "Le nom de votre étiquette comporte un trop grand nombre de caractères !"
        unset Label
    fi
done
LC_ALL=$langorigin
unset langorigin

On aurait pu prendre LANG à la place de LC_ALL, ça devrait faire la même chose (pas testé).
A la fin de mon petit script je reviens sur la valeur originale de LC_ALL, pour que dans la suite de ton script les éventuels messages d'erreur s'affichent dans la langue désirée et non pas en anglais.

Mais on peut faire plus simple et éviter l'utilisation de BASH_REMATCH (que je ne connaissais pas).
Il faut construire un motif qui ne touche pas les labels autorisés mais plutôt les labels non autorisés : [^0-9A-Za-z_-]
Il n'y a même pas besoin de répéteurs; il suffit de la présence d'un seul caractère non désiré pour discréditer le label.
Mon script devient alors :

#!/usr/bin/bash
langorigin=$LC_ALL
LC_ALL=C
rgx="[^0-9A-Za-z_-]"
while [ -z "$Label" ]
do
    echo -n "Choisissez l'étiquette (LABEL) de votre partition de données (pas d'espace, d'accent ni de caractère spécial, 16 caractères maximum) "
    read Label
    if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]
    then
        echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
        unset Label
    else
        echo "Label : $Label"
    fi
done
LC_ALL=$langorigin
unset langorigin

Hors ligne

#72 Aujourd'hui à 15:06

iznobe

Re : script pour montage automatique partitions de données

Salut et merci wink

Il faut construire un motif qui ne touche pas les labels autorisés mais plutôt les labels non autorisés : [^0-9A-Za-z_-]

c' est ce sur quoi j' étais parti au départ , sauf que sans gérer la langue , ça acceptait les caractères accentués ...

dans la gestion du label , j' ai fait 2messages pour l' utilisateur , mais j' aurais pu aussi bien adopté la même approche que toi pour simplifier le code pas testé , mais je suppose que ça doit le faire aussi et pas besoin de modifié la langue :

rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
	echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
	read Label
	
	if [[ ! "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
            echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
            unset Label
        else
            echo "Label : $Label"
    fi
done


EDIT :
Après test , si j' enlève rematch , les espaces ne sont pas gérés . et effectivement si on place le " - " juste avant le crochet final , pas besoin de l' échapper .
pour avoir un truc qui fonctionne , sans changement de langue , et simplifié , nouvelle regex roll :

rgx="(#.[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\S-]#+)" 
while [ -z "$Label" ]; do
	echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
	read Label
	
	if [[ ! "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
            echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
            unset Label
        else
            echo "Label : $Label"
    fi
done

Dernière modification par iznobe (Aujourd'hui à 16:06)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#73 Aujourd'hui à 15:27

iznobe

Re : script pour montage automatique partitions de données

shellcheck :
no ' souçaie ' :

#!/bin/bash

if [ "$(id -u)" != 0 ]
then
    echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
    exit 1
fi

warning :

if [ `id -u` != 0 ]
then
    echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
    exit 1
fi
shellcheck a écrit :
$ shellcheck myscript
 
Line 2:
if [ `id -u` != 0 ]
     ^-- SC2046 (warning): Quote this to prevent word splitting.
     ^-- SC2006 (style): Use $(...) notation instead of legacy backticks `...`.

Did you mean: (apply this, apply all SC2006)
if [ $(id -u) != 0 ]

$

je croyais que c' etait strictement equivalent pourtant :

"$(cmd)"

et

`cmd`

???

Dernière modification par iznobe (Aujourd'hui à 15:30)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#74 Aujourd'hui à 16:20

iznobe

Re : script pour montage automatique partitions de données

finalement pour UID root , j ' ai adopté la version de @watael , même si je ne sais pas vraiment ce que ca fait précisément roll
pour la regex , je préfère éviter de manipuler des variables globales ou système ( rayer la mention inutile , je pense que système est plus approprié vu que globale c' est dans du code mais bon comme le système c' est du code aussi ... )

Bref , pour le moment , j' en suis là :

#!/bin/bash

if ((UID)); then
    echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
    exit
fi

while [ -z "$Disk" ]; do
	echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
	read Disk
done

while [ -z "$PartNum" ]; do	
	echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
	read PartNum
done

rgx="(#.[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\S-]#+)"
while [ -z "$Label" ]; do
	echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
	read Label
	
	if [[ ! "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
            echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
            unset Label
        fi
done

while [ -z "$Rep" ]; do
	echo -n "Voulez-vous procéder au montage maintenant pour la partition $Disk$PartNum en y mettant pour étiquette : $Label[O/n] ?"
	read Rep
done

if [ "$Rep" = "n" ]; then
	echo -e "Annulation !"
	exit 0
	
else
	Bloc=/dev/$Disk$PartNum
	# echo $? : trouve pas retourne 1 , trouve retourne 0
	
	if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien 
		echo -e "La partition $Bloc n' existe pas !"
		exit 1
	fi
	
	if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
		echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
		exit 2
	fi
	
	if grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab 
		echo -e "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
		exit 3
	fi
		
	if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
		echo -e "La partition est déjà montée !"
		exit 4
	fi

	grep "$Label" /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
	if [ "$?" -eq 0 ]; then
		echo -e "L ' étiquette de la partition est déjà utilisée dans le fstab !"
		exit 5
	fi
	
	PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition	
	grep "$PartUUID" /etc/fstab # PartUUID est deja present dans fstab
	if [ "$?" -eq 0 ]; then
		echo -e "L UUID de la partition est déjà présent dans le fstab !"
		exit 6
		
	else # construction des éléments :
        	e2label "$Bloc" "$Label"
		mkdir -v  /media/"$Label"
		echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
		systemctl daemon-reload
                mount -a 2>/dev/null
		mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
		chown -v "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
		mkdir /media/"$Label"/.Trash-"$SUDO_UID"
		chown -v "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
		chmod -v 700 /media/"$Label"/.Trash-"$SUDO_UID"
	
		echo " Script pour montage de partition de données terminé avec succès !"
	fi
fi

ca me parait fonctionner comme attendu et être plus lisible du coup.

Dernière modification par iznobe (Aujourd'hui à 16:22)


retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#75 Aujourd'hui à 16:54

Watael

Re : script pour montage automatique partitions de données

finalement pour UID root , j ' ai adopté la version de @watael , même si je ne sais pas vraiment ce que ca fait précisément

c'est une simple Évaluation arithmétique :
si $UID vaut 0, alors FAUX.
si $UID est différent de 0, alors VRAI; ce qui est le cas si l'utilisateur n'est pas root (dont l'UID vaut toujours 0).

je croyais que c' etait strictement equivalent pourtant

ça l'est, si tu mets des guillemets ! tongue

(warning): Quote this to prevent word splitting.

le problème des "backticks", c'est l'imbrication de Substitutions de commande : on fait sans problème $(commande $(uneAutre) $(etUneAutre $(allezUne2plus))), mais le faire avec des "backticks"... je ne suis pas certain que ce soit possible.

edit: je viens de trouver un exemple (chercher "nested backticks").
ça donnerait ça :

echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"

par exemple.

Dernière modification par Watael (Aujourd'hui à 16:57)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne