[Ubuntu-QC] Aide pour déboguer un petit script.sh

Lami René lami at webestrie.com
Ven 16 Avr 01:29:50 BST 2010


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é




Plus d'informations sur la liste de diffusion Ubuntu-quebec