Page 1 sur 2

[SSH - rsync] - Meilleure option ? (Résolu)

Publié : mer. 06 mars 2013, 17:25
par Origyne
Bonjour,

J'ai fait un petit script qui utilise rsync afin de synchroniser un dossier de la session de mon amie avec son pc portable. Cela fonctionne bien, mais il y a quelques inconvénients.

> Elle lance le script en cliquant dessus, elle ne voit donc pas ce qu'il se passe ou même si cela fonctionne.
> Si l'IP locale change, cela ne fonctionne plus. (C'est ce qui vient de lui arriver)

Donc, que devrais-je faire ?

> M'arranger pour afficher une notification (KDE) une fois le transfert fini sans souci ? Si oui, auriez-vous une piste ? (Je débute)
> Changer ma manière de synchroniser ? Avez-vous des propositions ?

Merci pour vos conseils!!

Re: [SSH - rsync] - Meilleure option ?

Publié : mer. 06 mars 2013, 18:01
par tuxce
Origyne a écrit : > Elle lance le script en cliquant dessus, elle ne voit donc pas ce qu'il se passe ou même si cela fonctionne.
Lance le dans un terminal, non ?
Origyne a écrit : > Si l'IP locale change, cela ne fonctionne plus. (C'est ce qui vient de lui arriver)
Utilise localhost au lieu de l'IP ...
Origyne a écrit : > M'arranger pour afficher une notification (KDE) une fois le transfert fini sans souci ? Si oui, auriez-vous une piste ? (Je débute)

Code : Tout sélectionner

notify-send "Le script a fini"

Re: [SSH - rsync] - Meilleure option ?

Publié : mer. 06 mars 2013, 18:30
par Origyne
Lance le dans un terminal, non ?
> Moi, je peux, mais elle, c'est une autre histoire.^^
Utilise localhost au lieu de l'IP ...
> J'ai plusieurs serveurs SSH, mais j'imagine que je peux utiliser le nom du PC en fait.
notify-send "Le script a fini"
> Parfait, j'essaye !

Re: [SSH - rsync] - Meilleure option ?

Publié : mer. 06 mars 2013, 18:59
par Origyne
Afin d'améliorer le script, j'aimerais, en notifications, ajouter les noms des fichiers transférés ou mis à jour, comment puis-je faire ? Je n'ai pas l'habitude des scripts, mais cela peut être très pratique!

Re: [SSH - rsync] - Meilleure option ?

Publié : mer. 06 mars 2013, 19:55
par Ypnose
Pour lancer dans un terminal, il existe les commandes du type que tu peux ajouter au début de ton script:

Code : Tout sélectionner

urxvt -e
ou

Code : Tout sélectionner

xterm -e
Sinon, pour afficher les fichiers transférés, tu peux faire une boucle du genre:

Code : Tout sélectionner

for FILE in "blabla"
	do
		echo "$FILE"
done

Re: [SSH - rsync] - Meilleure option ?

Publié : mer. 06 mars 2013, 20:04
par FoolEcho
Sans le script, ça va être difficile de te dire précisément comment faire. :|

Techniquement et basiquement sur une notification:

Code : Tout sélectionner

file=~/un/de/tes/fichiers ; notify-send "$file a été envoyé" 
(sachant que la liste doit pouvoir se récupérer avec rsync)
(avec éventuellement le coup de la boucle mentionnée par Ypnose)

... mais bref, sans le script, difficile (impossible) d'être précis.

Re: [SSH - rsync] - Meilleure option ?

Publié : mer. 06 mars 2013, 23:55
par Origyne
J'ai fait cela :

Code : Tout sélectionner

#!/bin/bash
rsync -avP -e ssh /home/user/Dossier autreuser@serveur:/home/autreuser/
result=$(rsync -avP -e ssh /home/user/Dossier autreuser@serveur:/home/autreuser/)
notify-send "${result}"

exit 0
Cependant, le message retourné est souvent trop long :

Code : Tout sélectionner

 ./Exporter 
sending incremental file list
Dossier/
Dossier/Essai.odt
        4263 100%    0.00kB/s    0:00:00 (xfer#1, to-check=706/711)

sent 25297 bytes  received 62 bytes  3901.38 bytes/sec
total size is 3382616950  speedup is 133389.21
No summary specified.
Les notifications ne les présentent pas bien, et j'aimerais aussi avoir une "réponse de réussite". J'imagine que cela peut se faire via un if/else (je ne connais pas, j'extrapole).

Je sais, ça fait beaucoup et il serait plus simple de passer par un terminal, mais j'aime bien fouiller, apprendre et bricoler...

Qu'en pensez-vous ?

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 05:23
par lekaf974

Code : Tout sélectionner

#!/bin/bash

file=$HOME/transfert_erreur

rsync -avP -e ssh /home/user/Dossier autreuser@serveur:/home/autreuser/ 2> $file

if [ "$?" = "0" ]; then
	notify-send "Le transfert a été effectué avec succès."
else
	notify-send "Le transfert a échoué. Consulter le fichier $file"
	exit 1
fi

exit 0
Une suggestion de ma part.

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 09:14
par Origyne
Salut ! Merci pour ta proposition !

Cependant, lorsque je l'applique, j'ai toujours la présentation de l'erreur, quoique je fasse (j'ai enlevé les options verbeuses de rsync, j'ai volontairement fait des erreurs...je me retrouve même avec un fichier transfert_erreur vide, mais ma notification me demandait de le vérifier)...

En tout cas, je ne connaissais pas le principe exit 1 ou même de la redirection 2>...c'est intéressant! :)

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 09:45
par vlamy
Pour les redirections, si tu ne veux rien louper, tu peux faire :

Code : Tout sélectionner

#!/bin/bash
export LOGFILE='monlog.log'
echo 'foo' > $LOGFILE 2>&1
echo 'bar' >> $LOGFILE 2>&1
Le simple chevron > ajoute les flux de sortie (1 = stdout et 2 = stderr) au fichier en écrasant le contenu du fichier s'il existe. Le double chevron >>, lui, fait la même chose sans effacer le contenu du fichier.
Avec le script que je te donne en exemple, le fichier de log sera écrasé à chaque exécution (la première redirection de flux utilisant un chevron simple). Tu peux jouer avec ça, tu comprendras vite le principe.

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 09:47
par benjarobin
Encore plus simple :

Code : Tout sélectionner

ma-commande &> $LOGFILE

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 09:50
par FoolEcho
Autre manière «simple» de faire si tu veux voir la notification pour chaque fichier transféré (j'garantis pas que ça fonctionne tel quel, hein, 'suis un peu rouillé côté bash, ça devrait ou peu s'en faut mais c'est pour le principe au moins :mrgreen: ). :)

Juste la liste (on zappe la seconde ligne/info de transfert pour ne garder que le nom du fichier; sleep pour avoir le temps de voir les notifications successives):

Code : Tout sélectionner

rsync -avP /home/user/Dossier autreuser@serveur:/home/autreuser/ | while read line1; do read line2;notify-send "Transfert rsync" "$line1";sleep 2; done
Liste + info (faudrait sans doute jouer sur les options de rsync ou sur sed pour avoir quelque chose de plus lisible -- 'connais pas rsync :rtfm:):

Code : Tout sélectionner

rsync -avP /home/user/Dossier autreuser@serveur:/home/autreuser/ | while read line1; do read line2;notify-send "Transfert rsync" "$line1\n$line2";sleep 3; done

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 10:05
par vlamy
Je n'avais pas tilté, mais un truc important pour les scripts de backup : garder les logs !

Une façon de faire, en ajoutant une date lisible au nom du log :

Code : Tout sélectionner

date=`date +%x`
date=`echo $date | sed -e s:/:.:g`
logfile=$date"-monlog.log"
Personnellement je garde les dix logs les plus récents pour les backup persos. On peut penser au départ que c'est inutile, mais je te promet que ça sert, et ça ne prend pas beaucoup de place (même si tu trouve rsync verbeux, je te promet qu'il ne l'est pas tant que ça).

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 10:14
par Origyne
Je créais une date, déjà, mais c'est vrai que c'est toujours utile, d'autant plus que ce n'est pas moi qui vais me servir du script et qu'en cas d'erreur, ce sera toujours mieux.
Sinon, je connaissais les deux flux de redirection > et >> mais je ne savais pas qu'il en existait autant. Je dois avouer que je n'ai pas tout compris pour le moment, mais la pratique aidera !

Foolecho > C'est en effet intéressant de le faire fichier par fichier, c'est à tester, surtout que créer une boucle n'a pas l'air si compliqué!

Cependant, je me demande encore comment vérifier que tout s'est bien déroulé. D'ailleurs, comment le système le sait ? Comment puis-je savoir qu'une commande s'est bien effectuée ? 

C'est étrange comme façon de penser, peut-être?

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 10:54
par vlamy
Origyne a écrit : Cependant, je me demande encore comment vérifier que tout s'est bien déroulé. D'ailleurs, comment le système le sait ? Comment puis-je savoir qu'une commande s'est bien effectuée ? 

C'est étrange comme façon de penser, peut-être?
Tu as déjà tout dans la réponse de lekaf974.
Par convention un programme renvoit la valeur entière 0 quand il n'a pas rencontré d'erreur. Tout ce qui est différent de zéro correspond à un code d'erreur, interprétable selon les conventions du programme. Finalement en bash $? correspond au code de retour de la dernière commande exécutée. Donc la réponse (simple) à ta question est dans ce qui suit :
lekaf974 a écrit :

Code : Tout sélectionner

#!/bin/bash

file=$HOME/transfert_erreur

rsync -avP -e ssh /home/user/Dossier autreuser@serveur:/home/autreuser/ 2> $file

if [ "$?" = "0" ]; then
	notify-send "Le transfert a été effectué avec succès."
else
	notify-send "Le transfert a échoué. Consulter le fichier $file"
	exit 1
fi

exit 0
Une suggestion de ma part.

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 12:04
par Ypnose
vlamy a écrit :

Code : Tout sélectionner

date=`date +%x`
date=`echo $date | sed -e s:/:.:g`
logfile=$date"-monlog.log"
C'est très sale.

Code : Tout sélectionner

date=$(date "+%d.%m.%y")
logfile=$date"-monlog.log"

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 12:13
par Origyne
Par convention un programme renvoit la valeur entière 0 quand il n'a pas rencontré d'erreur. Tout ce qui est différent de zéro correspond à un code d'erreur, interprétable selon les conventions du programme. Finalement en bash $? correspond au code de retour de la dernière commande exécutée. Donc la réponse (simple) à ta question est dans ce qui suit :
> C'est exactement ce que je voulais savoir, merci ! :)

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 12:44
par Origyne
Voilà mon script pour le moment :

Code : Tout sélectionner

#!/bin/bash

file=$HOME/Scripts/.erreur

rsync -avP -e ssh /home/Dossier/ user@192.168.0.10:/home/user/ 2> $file

if [ "$?" = "O" ]; then
  notify-send --icon=/home/user/Scripts/.transfert_ok.png "J'ai bien transféré les fichiers..."
else
  notify-send --icon=/home/user/Scripts/.transfert_ko.png "Euh...J'ai eu un p'tit problème..."
exit 1

fi
exit 0
(J'avoue que c'est de la copie simple là)

Et voilà ce que ça me donne lancé dans un terminal :

Code : Tout sélectionner

sending incremental file list
Dossier/
Dossier/test1.odt
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=702/711)
Dossier/test2.jpg
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=701/711)
Dossier/test3.iso
           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=700/711)
Dossier/Essai/
Dossier/Essai2/

sent 21031 bytes  received 107 bytes  3252.00 bytes/sec
total size is 3382612657  speedup is 160025.20

Pourtant, la notification qui apparaît est celle de l'erreur et non celle de la réussite, alors que les fichiers ont bien été transférés, où est-ce que je fais une erreur ?

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 13:23
par vlamy
Origyne a écrit : Pourtant, la notification qui apparaît est celle de l'erreur et non celle de la réussite, alors que les fichiers ont bien été transférés, où est-ce que je fais une erreur ?
C'est une erreur dans la condition du if, je te propose la correction suivante :

Code : Tout sélectionner

#!/bin/bash
echo "toto"
if [ $? = 0 ]; then
    notify-send "OK !"
else
    notify-send "NOK"
    exit 1
fi
exit 0
EDIT : grillé Oktoberfest, mais sa réponse est meilleure :)
Ypnose a écrit :
vlamy a écrit :

Code : Tout sélectionner

date=`date +%x`
date=`echo $date | sed -e s:/:.:g`
logfile=$date"-monlog.log"
C'est très sale.

Code : Tout sélectionner

date=$(date "+%d.%m.%y")
logfile=$date"-monlog.log"
Mis à jour.
Merci !

Re: [SSH - rsync] - Meilleure option ?

Publié : jeu. 07 mars 2013, 13:24
par oktoberfest
Tu as confondu 0 (zéro)

Code : Tout sélectionner

if [ "$?" = "0" ]; then
et O (la lettre o)

Code : Tout sélectionner

if [ "$?" = "O" ]; then
Il faut mettre un zéro, car $? renvoie une valeur numérique.