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
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-quebec