Philippe Gauthier a écrit : > Bonjour René! > > Je viens de jeter un coup d'oeil sur la page: > >> http://doc.ubuntu-fr.org/points_de_restauration_pour_un_systeme_linux#script >> > Il y a un détail qui m'accroche... c'est la commande pour rendre le > script "exécutable". Je me permets une petite digression :) La page > dit : > > sudo chmod -R +rwx PointDeRestauration.sh > > Ceci n'est pas trop efficace. D'abord, la commande sudo ne serait > nécessaire que si le fichier PointDeRestauration.sh ne pouvait être > altéré que par le super-utilisateur (root). C'est le cas de la plupart > des fichiers installés sur le système, mais puisqu'on vient de créer ce > fichier à la main, on dispose certainement des permissions pour le > modifier. Bye bye sudo. Ce qui nous amène à : > > chmod -R +rwx PointDeRestauration.sh > > Mais qu'est-ce que ces chmod, R, rwx et autres codes secrets? :) "chmod" > sert à modifier certaines informations à propos d'un fichier ou d'un > répertoire -- les droits d'accès, et certaines fonctionnalités comme > "exécutable". "-R" modifie la commande pour la rendre récursive. > Autrement dit, si on l'applique sur un répertoire, la commande modifie > le répertoire lui-même puis poursuit sur sa lancée en modifiant tous les > fichiers et sous-répertoires inclus. Finalement, "+rwx" sont les codes > correspondant aux informations à modifier. Dans le cas présent, on > ajoute (+), les permissions de lecture (r), d'écriture (w), puis le mode > "exécutable" (x). Ici, l'ajout du droit à la lecture et à l'écriture > (pour tous les utilisateurs) ne nous intéresse pas vraiment. > > Puisqu'on ne veut modifier qu'un seul fichier, on vire le "-R". Comme ça > on risque moins de faire des dégâts qui se propagent (ce qui peut être > particulièrement grave si on a utilisé "sudo"!) En final (ouf!) : > > chmod +w PointDeRestauration.sh > Bonjour Philippe,
J'ai une surcharge de travail et c'est pour ça, les délais pour faire le suivi de mes courriels ! Ta logique est irréprochable et tes explications de haute qualité pédagogiques, j'apprécie grandement que tu prennes autant de temps pour décrire aussi bien les choses ! J'admire ça ! Avant la lecture de ta réponse, je n'y connaissais pas grand-chose à la commande « chmod », et je n'avais que copié d'un fil de discussion sans tout comprendre, les commendes d'une procédure que je trouvais intéressante à partager sur le Wiki. Je viens de corriger la commande sur le Wiki par « chmod +w PointDeRestauration.sh ». Un grand merci a toi ! > Pour ce qui est du script, ça fonctionne bien ! Je pense l'utiliser sur > un serveur... > > Des détails, des détails... :) > J'apprécie les détails ! > Ligne 5, pour déterminer si le répertoire existe, je préfère toujours le > demander explicitement à bash (voir "man test" pour les détails) plutôt > que de tenter de provoquer un code d'erreur : > > if [ -d ~/PointDeRestauration ] > > Un autre façon de faire serait de carrément éliminer la vérification et > demander à mkdir de s'en charger : > > mkdir -p ~/PointDeRestauration > OK, si je comprends bien, que le dossier existe ou pas on demande sa création et cela ne cause aucun problème, mais cela rend la structure du script plus simple ! Est-ce une bonne interprétation de ton propos ? > Le nom 2010-04-12, c'est plus facile à saisir pour mon vieux neurone que > 100412. On peut ajouter la vérification de la commande dpkg pour des > points bonis : > > 1) > point=$(date +%F) > if dpkg --get-selections > ~/PointDeRestauration/$point; then > echo "Le point de restauration « $point » a est créé." > else > echo "La création du point de restauration a échoué." > fi > ;; > Pour ce qui est du format de la date, tu devances mes demandes et besoins ! Encore merci ! Est-ce que le « done » fait partie de la boucle du « case » ? > Entre les lignes 28 et 29, j'ajouterais une vérification que > l'utilisateur a tapé le nom d'un point de vérification correctement (et > donner de l'aide sinon). J'ai tapé le chemin complet d'un point de > restauration (puisque c'est cela que le script m'a donné comme info et > qu'autrement je ne sais pas lire les instructions) et j'ai reçu une > erreur pas jolie comme quoi le fichier n'existait pas. Ci-dessous, le > "cd" nous permet de lister que le nom des points de restauration plutôt > que d'obtenir le leur chemin complet. > > 2) > echo "Quel point de restauration souhaitez-vous utiliser ?" > echo > cd ~/PointDeRestauration; ls > read point > if [ -f ~/PointDeRestauration/$point ]; then > sudo dpkg --clear-selections > if sudo dpkg --set-selections < ~/PointDeRestauration/$point; then > echo "Votre système a été restauré au point « $point »." > else > echo "La restauration a échoué." > fi > else > echo "La date de restauration « $point » n'est pas disponible." > fi > ;; > > Pour d'autres points bonis :) On remarque que "~/PointDeRestauration/" > est recopié 5 ou 6 fois dans le script. On pourrait ajouter une variable > en tête du script qui contiendrait le nom du répertoire, puis utiliser > cette variable dans le code. Si on décide de changer l'endroit où sont > enregistrés les points (je pense à quelque chose comme /var/...), ce > serait vraiment plus facile à faire. > Idée géniale que je partage ! Ça, c'est de la programmation efficace et élégante ! > (Est-ce que ça parait trop que je pratique pour le LPIC-1 ? :) > Je ne sais pas ce qu'est « pratique pour le LPIC-1 », mais continus a pratiqué, j'admire tes résultats ! Voici ma dernière version du script en y incorporant, je crois, toutes tes suggestions : #!/bin/bash nomDossier="~/PointDeRestauration/" clear mkdir -p $nomDossier echo "" echo " 1) Créer un point de restauration. " echo "" echo " 2) Restaurer un point. " echo "" echo " 3) Quitter. " echo "" echo " Taper le numéro de l'action que vous souhaitez ou CTRL-C pour quitter ce script : " echo "" read touche1 case "$touche1" in 1) point=$(date +%F) if dpkg --get-selections > $nomDossier + "/" + $point; then echo "Le point de restauration « $point » a est créé avec succès !" else echo "La création du point de restauration a échoué !" fi ;; 2) echo "Quel point de restauration souhaitez-vous utiliser ?" echo cd $nomDossier ls read point if [ -f $nomDossier + "/" + $point ]; then sudo dpkg --clear-selections if sudo dpkg --set-selections < $nomDossier + "/" + $point; then echo "Votre système a été restauré au point « $point » avec succès !" else echo "La restauration a échoué !" fi else echo "Le fichier pour la date de restauration « $point » n'est pas disponible !" fi ;; 3) break ;; done J'y ai probablement glissé des erreurs, je fais de mon mieux. Aurais-tu l'amabilité de le réviser et de me faire te recommandations ! Pour l'instant, avec la commande « chmod +w PointDeRestauration.sh », suivi de « ./PointDeRestauration.sh », j'ai le message d'erreur suivant : bash: ./PointDeRestauration.sh: Permission non accordée Avec la commande « chmod +w PointDeRestauration.sh », suivi de « sh ./PointDeRestauration.sh », avec ce nouveau script, comme avec l'ancien, J'ai toujours le même message d'erreur avec la rencontre des « in » dans le script : : bad variable name ./PointDeRestauration.sh: 15: Syntax error: word unexpected (expecting "in") Avec la commande « chmod +w PointDeRestauration.sh », suivi de « bash ./PointDeRestauration.sh », j'ai le résultat suivant : : commande introuvableh: line 3: clear 1) Créer un point de restauration. 2) Restaurer un point. 3) Quitter. Taper le numéro de l'action que vous souhaitez ou CTRL-C pour quitter ce script : 1 » : identifiant non valablene 14: read: « touche1 »PointDeRestauration.sh: line 15: Erreur de syntaxe près du symbole inattendu « in '/PointDeRestauration.sh: line 15: ` case "$touche1" in Pourquoi les résultats sont différents entre l'utilisation de « sh ./... » et « bash ./... » ? Est-ce que tu as une idée du problème ? Un grand merci pour ton aide si généreuse ! L'ami René -- Ubuntu-quebec mailing list Ubuntu-quebec@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-quebec