[Résolu]Script Shell pour Rsync

Script Shell pour Rsync [Résolu] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 28-06-2007 à 10:03:21    

Bonjour,
 
Je suis sur un problème depuis plusieurs jours au niveau de la sauvegarde d'un site web hébergé chez OVH sur un serveur hébergé localement.
La meilleure méthode est Rsync, ca je pense pas que l'on pourra me dire le contraire et je me suis donc tout simplement mis à faire un script qui devra être lancé tous les soirs grâce à un CRON.
 
Seulement ce script fonctionne... bizarrement !! Là ou je lui demande de me sauvegarder /etc, il me sauvegarde /root, et la ou je lui demande de sauver /var, il me sauvegarde /home... donc bon je sèche un peu !!
 
De même, j'ai une variable ou je stock la date du moment pour daté l'archive mais au bout du compte le dossier s'apelle "backup-date".
En esperant que l'on arrivera à me dépanner parce que vraiment je ne vois pas !! Merci d'avance pour votre participation (surtout vu la longueur du script :sleep:  )
 

Code :
  1. #!/bin/sh
  2. ###############################################################################
  3. #########################INITIALISATION DES VARIABLES##########################
  4. ###############################################################################
  5. # Date actuelle pour le nommage des dossiers de sauvegarde
  6. DATEA='date +%d%m%y'
  7. # Repertoires du serveur distant a sauvegarder
  8. SOURCES="/etc \
  9.      /var/www \
  10.      /var/lib/mysql \
  11.      "
  12. # Machine distante
  13. REMMACHINE=@ip machine distante
  14. # Utilisateur distant
  15. REMUSER=root
  16. # Repertoire local de sauvegarde
  17. TARGET="/home/dokeos/backupDokeos"
  18. # Repertoire local de stockage des archives
  19. ARCTARGET="/home/dokeos/backupDokeosArchives"
  20. # Options de la commande RSYNC
  21. OPTIONS="--force --ignore-errors --delete --delete-excluded --backup"
  22. # Fichier "log" ou seront inscrites les diffentes etapes du script (echo)
  23. FICHIERLOG=$TARGET/logbackup
  24. # Fichier "log" distant qui sera envoye a ladministrateur systeme
  25. REMLOG=/home/dokeos/logbackupim
  26. # Adresse Email de l'administrateur systeme
  27. ADDRADMIN=@mail admin
  28. ###############################################################################
  29. ####################################SCRIPT#####################################
  30. ###############################################################################
  31. # Verification de la presence et de l'accessibilite au dossier cible
  32. # Creation si il n'existe pas
  33. if test -x $FICHIERLOG;
  34. then
  35.     rm $FICHIERLOG
  36.     touch $FICHIERLOG
  37. fi
  38. echo "DEBUT" >> $FICHIERLOG
  39. echo "Check des dossiers de sauvegarde ..." >> $FICHIERLOG
  40. # Verification de l'existance du dossier de stockage de la sauvegarde
  41. # Si il n'existe pas, nous le creeons
  42. # Si la creation echoue, exit
  43. echo "Dossier $TARGET check ..." >> $FICHIERLOG
  44. if ! test -x $TARGET;
  45. then
  46.     echo "Le repertoire $TARGET sur la machine locale n'existe pas ou n'as pas des permissions convenables.!." >> $FICHIERLOG
  47.     echo "Creation..." >> $FICHIERLOG
  48.     mkdir -p $TARGET
  49.     if ! test -x $TARGET;
  50.     then
  51.         echo "Le repertoire $TARGET n'a pas pu etre cree ou vous n'avez pas les permissions necessaires pour le faire.!." >> $FICHIERLOG
  52.         echo "Arret du script" >> $FICHIERLOG
  53.         exit 2
  54.     fi
  55.     echo "Repertoire $TARGET cree avec succes !!" $FICHIERLOG
  56.     echo "" >> $FICHIERLOG
  57. fi
  58. # Verification de l'existance du dossier de stockage des archives de sauvegardes
  59. # Si il n'existe pas, nous le creeons
  60. # Si la creation echoue, exit
  61. echo "Dossier $TARGET ok" >> $FICHIERLOG
  62. echo "Dossier $ARCTARGET check ..." >> $FICHIERLOG
  63. if ! test -x $ARCTARGET;
  64. then
  65.     echo "Le repertoire $ARCTARGET sur la machine locale n'existe pas ou n'as pas des permissions convenables.!." >> $FICHIERLOG
  66.     echo "Creation..." >> $FICHIERLOG
  67.     mkdir -p $ARCTARGET
  68.     if ! test -x $ARCTARGET;
  69.     then
  70.         echo "Le repertoire $ARCTARGET n'a pas pu etre cree ou vous n'avez pas les permissions necessaires pour le faire.!." >> $FICHIERLOG
  71.         echo "Arret du script" >> $FICHIERLOG
  72.         exit 2
  73.     fi
  74.     echo "Repertoire $ARCTARGET cree avec succes !!" $FICHIERLOG
  75.     echo "" >> $FICHIERLOG
  76. fi
  77. echo "Dossier $ARCTARGET OK" >> $FICHIERLOG
  78. echo "Check des dossiers de sauvegarde termine avec succes" >> $FICHIERLOG
  79. echo "" >> $FICHIERLOG
  80. # Verification de l'existance des dossiers a sauvegarder
  81. # Si ils n'existent pas, exit
  82. echo "Verification des sources distantes .!." >> $FICHIERLOG
  83. for source in $SOURCES;
  84. do
  85.     echo "Analyse de $SOURCE ..." >> $FICHIERLOG
  86.     if  ! ssh $REMUSER@$REMMACHINE "test -x $SOURCE";
  87.     then
  88.         echo "Erreur sur la source selectionnee" >> $FICHIERLOG
  89.         echo "Repertoire inexistant ou n'ayant pas les permissions suffisantes" >> $FICHIERLOG
  90.         echo "" >> $FICHIERLOG
  91.         exit 2
  92.     fi
  93.     echo "Analyse de $SOURCE terminee avec succes !!" >> $FICHIERLOG
  94. done
  95. echo "Verification des sources distantes termine avec succes !" >> $FICHIERLOG
  96. echo "" >> $FICHIERLOG
  97. echo "LANCEMENT DE LA SAUVEGARDE..." >> $FICHIERLOG
  98. for source in $SOURCES;
  99. do
  100. # Creation du dossier correspondant a la source sur le serveur de sauvegarde
  101.     if ! test -d $TARGET/$SOURCE;
  102.     then
  103.         mkdir -p $TARGET/$SOURCE
  104.         echo "Dossier de $SOURCE cree avec succes sur la sauvegarde" >> $FICHIERLOG
  105.     fi
  106. # Lancement de la commande de sauvegarde RSYNC
  107. echo "Lancement de RSYNC..." >> $FICHIERLOG
  108.     rsync $OPTIONS -avzr -e "ssh" $REMUSER@$REMMACHINE:$SOURCE $TARGET/$SOURCE
  109. done
  110. echo "SAUVEGARDE TERMINEE AVEC SUCCES !!" >> $FICHIERLOG
  111. echo "ARCHIVAGE..." >> $FICHIERLOG
  112. # Archivage de la sauvegarde du jour
  113. tar -cvzf $TARGET-$DATEA.tar.gz $TARGET
  114. cp -R $TARGET-$DATEA.tar.gz $ARCDATEA
  115. echo "ARCHIVAGE TERMINE AVEC SUCCES !!" >> $FICHIERLOG
  116. echo "" >> $FICHIERLOG
  117. echo "JOURNALISATION TERMINEE AVEC SUCCES" >> $FICHIERLOG
  118. # Envoie du fichier de log sur le serveur distant pour que celui ci puisse l'envoyer sur l'email de l'administrateur systeme
  119. scp $FICHIERLOG $REMMACHINE:$REMLOG
  120. ssh $REMUSER@$REMMACHINE "mail -s 'backup du jour' ADDRADMIN < $REMLOG"

Message cité 1 fois
Message édité par meijin le 28-06-2007 à 11:11:51
Reply

Marsh Posté le 28-06-2007 à 10:03:21   

Reply

Marsh Posté le 28-06-2007 à 10:23:19    

déjà, tu as une erreur ligne 8 : il faut mettre la commande entre backquotes :

DATEA=`date +%d%m%y`


Ca devrait régler ton problème de nom de dossier de sauvegarde.
 
Pour le reste, j'ai pas eu le temps de regarder les détails...


---------------
TriScale innov
Reply

Marsh Posté le 28-06-2007 à 10:30:09    

dans ton for tu met source et après tu utilise $SOURCE ?


---------------
Never f**k with your systems administrator. Why? Because they know what you do with all that free time! |?? | SAVE Jericho !
Reply

Marsh Posté le 28-06-2007 à 10:31:16    

Ah merci bien, en effet ca marche tout de suite mieux comme ca ^^
 
En passant une petite précision, la commande rsync utilisée dans ce script je l'ai testée avant en ne mettant pas de variables mais les chemin réels etc... et elle fonctionnais tres bien
 
 
Edit : C'est au niveau des majuscules que ca te choque?

Message cité 1 fois
Message édité par meijin le 28-06-2007 à 10:31:58
Reply

Marsh Posté le 28-06-2007 à 10:55:07    

Quelques remarques:
- ligne 153: sans doute $ADDRADMIN au lieu de ADDRADMIN.  
Sans doute à utiliser dans le subject $DATEA aussi ce qui permet d'avoir la date dans le sujet du courrier.
- même question soumise par Le_Tolier.
- scp/ssh: je me demande où tu fournis login/password SSH.

Reply

Marsh Posté le 28-06-2007 à 10:58:52    

meijin a écrit :

Ah merci bien, en effet ca marche tout de suite mieux comme ca ^^

 

En passant une petite précision, la commande rsync utilisée dans ce script je l'ai testée avant en ne mettant pas de variables mais les chemin réels etc... et elle fonctionnais tres bien

 


Edit : C'est au niveau des majuscules que ca te choque?

 

c'est pas le fait d'utiliser des majuscule, mais plus que un coup c est source et après SOURCE, je sais pas si ca fonctionne très bien.

 
dnlilas a écrit :

Quelques remarques:
- ligne 153: sans doute $ADDRADMIN au lieu de ADDRADMIN.
Sans doute à utiliser dans le subject $DATEA aussi ce qui permet d'avoir la date dans le sujet du courrier.
- même question soumise par Le_Tolier.
- scp/ssh: je me demande où tu fournis login/password SSH.

 

utilisation de clef ssh surment

Message cité 1 fois
Message édité par Le_Tolier le 28-06-2007 à 10:59:22

---------------
Never f**k with your systems administrator. Why? Because they know what you do with all that free time! |?? | SAVE Jericho !
Reply

Marsh Posté le 28-06-2007 à 11:01:50    

dnlilas a écrit :

Quelques remarques:
- ligne 153: sans doute $ADDRADMIN au lieu de ADDRADMIN.  
Sans doute à utiliser dans le subject $DATEA aussi ce qui permet d'avoir la date dans le sujet du courrier.


 
Merci c'est corrigé, j'avais pas fais attention
 

dnlilas a écrit :

- même question soumise par Le_Tolier.


 
Justement je comprend pas bien sa question en fait si vous pouviez préciser ce qui pose pb
parce que en fait ce que je fais c'est que a chaque bouclage, je prend ce qu'il ya dans $SOURCES (initialisée au dessus) et je met dans source histoire que chaque boucle s'occupe d'un dossier spécifique...  
 
En gros au premier coup ya /etc qui se met dans source et je le ressort ensuite en appelant ma variable comme on appelle un variable normale. A moins que je n'ai pas bien saisi le concept du for... :??:  
 
 

dnlilas a écrit :

- scp/ssh: je me demande où tu fournis login/password SSH.


 
En fait j'ai générer une paire de clés DSA et j'ai mis la clé publique de l'user local dans le authorized_keys de mon serveur de prod ;)

Reply

Marsh Posté le 28-06-2007 à 11:03:46    

Le_Tolier a écrit :

c'est pas le fait d'utiliser des majuscule, mais plus que un coup c est source et après SOURCE, je sais pas si ca fonctionne très bien.


 
Je dois avouer que pour le for j'ai regarder un peu les exemples sur le net et j'ai vu des personnes faire comme ça donc j'ai betement suivi mais tu as peux etre raison, je vais modifier et voir ce que ca donne, merci pour la remarque
 
Bon ben tu avais raison en effet maintenant ca passe tout bien vraisemblablement... en tout cas pour l'instant car la sauvegarde est très longue vue les données a récupérée !!
 
Encore une fois je me suis fais pieger par une erreur des plus primitives
 
Merci beaucoup pour votre aide :jap:  Vous m'avez vraiment sortis une grosse épine du pied


Message édité par meijin le 28-06-2007 à 11:11:25
Reply

Marsh Posté le 28-06-2007 à 11:22:08    

franceso a écrit :

déjà, tu as une erreur ligne 8 : il faut mettre la commande entre backquotes :

DATEA=`date +%d%m%y`


Ca devrait régler ton problème de nom de dossier de sauvegarde.
 
Pour le reste, j'ai pas eu le temps de regarder les détails...


Et d'ailleurs, pour rester compatible avec les nouvelles versions de bash, il vaut mieux mettre

DATEA=$(date +%d%m%y)


 
[:cupra]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 28-06-2007 à 11:24:48    

wedgeant a écrit :

Et d'ailleurs, pour rester compatible avec les nouvelles versions de bash, il vaut mieux mettre

DATEA=$(date +%d%m%y)

 

[:cupra]


ah bon donc, il considere l'expression calculée comme variable :love:
c'est bien mieux comme cela

Message cité 1 fois
Message édité par memaster le 28-06-2007 à 11:25:06

---------------
ma conduite intérieure .:R | memaster pilote officiel de la HFR Badoit-Auchan F1 Team | zéro tracas, zéro blabla MMa.ster
Reply

Marsh Posté le 28-06-2007 à 11:24:48   

Reply

Marsh Posté le 28-06-2007 à 11:28:03    

memaster a écrit :

ah bon donc, il considere l'expression calculée comme variable :love:  
c'est bien mieux comme cela

Non, une variable, ce serait plutôt ${VAR}.
 
Mais c'est vrai que c'est vachement mieux comme ça pour les problèmes d'imbrications de quotes etc...


---------------
TriScale innov
Reply

Marsh Posté le 28-06-2007 à 11:35:11    

wedgeant a écrit :

Et d'ailleurs, pour rester compatible avec les nouvelles versions de bash, il vaut mieux mettre

DATEA=$(date +%d%m%y)


 
[:cupra]


 
 
Ok merci, et c'est vrai que c'est plus clair qu'avec les backquotes! et plus dans la logique du langage

Reply

Marsh Posté le 28-06-2007 à 12:25:12    

La syntaxe $() c'est une extension... La bonne notation, la seule la vraie l'originale, c'est les backquotes. Genre sous bsh, y'a pas $().

Reply

Marsh Posté le 28-06-2007 à 12:28:10    

matafan a écrit :

La syntaxe $() c'est une extension... La bonne notation, la seule la vraie l'originale, c'est les backquotes. Genre sous bsh, y'a pas $().


j'allais posé la question de la compatibilité du code avec le standard :??:


---------------
ma conduite intérieure .:R | memaster pilote officiel de la HFR Badoit-Auchan F1 Team | zéro tracas, zéro blabla MMa.ster
Reply

Marsh Posté le 28-06-2007 à 12:38:06    

matafan a écrit :

La syntaxe $() c'est une extension... La bonne notation, la seule la vraie l'originale, c'est les backquotes. Genre sous bsh, y'a pas $().


Voui, mais là il code en bash donc on s'en tape de la comptatibilité inverse :o


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 28-06-2007 à 13:43:26    

wedgeant a écrit :

Voui, mais là il code en bash donc on s'en tape de la comptatibilité inverse :o


portabilité du code toussa :o


---------------
ma conduite intérieure .:R | memaster pilote officiel de la HFR Badoit-Auchan F1 Team | zéro tracas, zéro blabla MMa.ster
Reply

Marsh Posté le 28-06-2007 à 13:49:45    

wedgeant a écrit :

Voui, mais là il code en bash donc on s'en tape de la comptatibilité inverse :o


 

meijin a écrit :

Code :
  1. #!/bin/sh


Y a rien qui te garantit que /bin/sh -> bash sur toutes les plateformes... [:cerveau o]


---------------
TriScale innov
Reply

Marsh Posté le 28-06-2007 à 21:51:42    

Sauf que personne ne fait de vrai sh 'pur'... j'ai essayé une fois en suivant les recommandations de portabilité des autotools :
http://www.gnu.org/software/autoco [...] tml#SEC114
 
La section 10.8 nous apprend que "!" pour la négation logique n'est pas portable, et la section 10.5 que $@ non plus (bon ca ok c'est connu).
 
Donc les shell script portables, j'y crois pas... autant mettre #!/bin/bash en shebang, assumer et utiliser les bashismes à donf ( genre ((i++)) et autres [[ ]] ) :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 29-06-2007 à 04:55:33    

A mon avisl'erreur c'est  la notion de script shell portable :D

Reply

Marsh Posté le 29-06-2007 à 09:45:19    

Xavier_OM a écrit :

Sauf que personne ne fait de vrai sh 'pur'... j'ai essayé une fois en suivant les recommandations de portabilité des autotools :
http://www.gnu.org/software/autoco [...] tml#SEC114
 
La section 10.8 nous apprend que "!" pour la négation logique n'est pas portable, et la section 10.5 que $@ non plus (bon ca ok c'est connu).
 
Donc les shell script portables, j'y crois pas... autant mettre #!/bin/bash en shebang, assumer et utiliser les bashismes à donf ( genre ((i++)) et autres [[ ]] ) :o


Dans apt-zip, on fait du shell-script portable :o
 
C'est pas si difficile, il suffit de vérifier que ton script passe aussi avec dash, et tu es à peu près sûr qu'il n'y a aucun bashisme dedans...


---------------
TriScale innov
Reply

Marsh Posté le 29-06-2007 à 10:24:48    

franceso a écrit :

Dans apt-zip, on fait du shell-script portable :o
 
C'est pas si difficile, il suffit de vérifier que ton script passe aussi avec dash, et tu es à peu près sûr qu'il n'y a aucun bashisme dedans...


 
j'ai survolé le code d'apt-zip ya quelque temps, et j'ai des doutes sur la portabilité  :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 29-06-2007 à 10:27:49    

chaica a écrit :

A mon avisl'erreur c'est  la notion de script shell portable :D


on dira portable avec le minimum de modifs parce que le code parfait n'existe pas

Message cité 1 fois
Message édité par memaster le 29-06-2007 à 10:28:09

---------------
ma conduite intérieure .:R | memaster pilote officiel de la HFR Badoit-Auchan F1 Team | zéro tracas, zéro blabla MMa.ster
Reply

Marsh Posté le 29-06-2007 à 10:33:36    

Xavier_OM a écrit :

j'ai survolé le code d'apt-zip ya quelque temps, et j'ai des doutes sur la portabilité  :o


Je parle pas du code d'apt-zip lui même (qui est destiné à tourner sur des machines Debian, donc possédant bash), mais plutôt des scripts de téléchargement des paquets qui sont générés.
Si tu as des doutes sur la portabilité à ce niveau-là, n'hésite pas à le signaler : ça fait partie des choses qu'on essaie de garantir.


---------------
TriScale innov
Reply

Marsh Posté le 29-06-2007 à 10:45:17    

memaster a écrit :

on dira portable avec le minimum de modifs parce que le code parfait n'existe pas


Sisi, ça existe:

Code :
  1. #! /bin/sh
  2. echo


 
[:cerveau cupra]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

Marsh Posté le 29-06-2007 à 10:48:35    

wedgeant a écrit :

Sisi, ça existe:

Code :
  1. #! /bin/sh
  2. echo


 
[:cerveau cupra]


on mettra ça sur le compte du vendredi :heink:


---------------
ma conduite intérieure .:R | memaster pilote officiel de la HFR Badoit-Auchan F1 Team | zéro tracas, zéro blabla MMa.ster
Reply

Marsh Posté le 29-06-2007 à 12:08:16    

wedgeant a écrit :

Sisi, ça existe:

Code :
  1. #! /bin/sh
  2. echo


 
[:cerveau cupra]


 
méfions-nous du echo :D http://www.gnu.org/software/autoco [...] tml#SEC122


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 13-07-2007 à 02:05:34    

Salut,
 
au cas ou tu ne le sait pas, tu peut mettre ton script en debug de plusieurs façons:
mettre  
#!/bin/sh -x
au debut,
executer le script comme ça:
sh -x lescript.sh
 
ligne 47:
if test -x $FICHIERLOG;
AMHA -x c'est pour les executables. un fichier c'est -f ou -e
 
Il faut "quoter" toutes les variables.
 
++
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed