Forum Astuces.divers bidouille script BASH problème :(

Posté par  .
Étiquettes : aucune
1
1
fév.
2011
Bonjour à tous!

Voila le contexte, j'ai de nombreux scripts rsync qui tourne chaque nuit, le problème c'est qu'il est difficil de savoir si chaque commande rsync a bien fonctionner ou non et pourtant, c'est primordial.

Je me suis donc dis que je pourrais générer un csv suite à l'execution de chaque commande afin de transformer ça par la suite en page html consultable chaque jour...

Mais je rencontre certaines difficulté...
L'idée c'est que dans chaque script rsync je source un fichier nommé "lib.h" ce fichier contient une fonction my_rsync () et je veux remplacer toutes mes commandes rsync par "my_rsync" (merci sed ;)

Le problème c'est que certains arguments de la ligne de commande originale et notamment les " " semblent ne pas être pris en compte.

Voici les scripts:

tout d'abord lib.h:

#!/bin/bash

my_rsync () {

DATE=$(date "+%m/%d/%y %H:%M")
PJ=$PROJECT

CMD=$*
rsync $*

RESULT=$?

PARSED_COMMAND=$(echo $*)

if [ $RESULT = 0 ]
then
OKNOK=OK
else
OKNOK=KO
fi

echo "${OKNOK};${DATE};${PJ};${0};${PARSED_COMMAND}" >> LIST.txt
}

Puis mon script de test nommé test.sh
#!/bin/sh
# Variable definition

RHOST=my.remote-server.com
RUSER=user
sshkey=/root/.ssh/transfer

. ./lib/lib.h

# Synchronize local generated_data directory to remote host
my_rsync -azurLptq -e "ssh -i $sshkey" --progress --exclude=*SEG* --exclude=*Md* --exclude=*YouHou* --exclude=*BreastFV* /datas/RES/generated_data ${RUSER}@${RHOST}:/data/RES/

====================================
Comme vous pouvez le voir le script précédent source le script lib.sh

Il semble que la partie de la ligne contenant "ssh -i $sshkey" ne soit pas récupérer lors de l'execution de $*

Voici l execution du test-script.sh avec bash -xv
#!/bin/sh
# Variable definition

RHOST=my.remote-server.com
+ RHOST=my.remote-server.com
RUSER=user
+ RUSER=ruser
sshkey=/root/.ssh/transfer
+ sshkey=/root/.ssh/transfer

. ./lib/lib.h
+ . ./lib/lib.h
#!/bin/bash

my_rsync () {

DATE=$(date "+%m/%d/%y %H:%M")
PJ=$PROJECT

CMD=$*
`echo rsync $CMD`
RESULT=$?

PARSED_COMMAND=$(echo $*)

if [ $RESULT = 0 ]
then
OKNOK=OK
else
OKNOK=KO
fi

echo "${OKNOK};${DATE};${PJ};${0};${PARSED_COMMAND}" >> LIST.txt
}

# Synchronize local generated_data directory to remote host
my_rsync -azurLptq -e "ssh -i $sshkey" --progress --exclude=*SEG* --exclude=blabla
+ my_rsync -azurLptq -e 'ssh -i /root/.ssh/transfer' --progress '--exclude=*SEG*' '--exclude=*blablablablabala
date "+%m/%d/%y %H:%M")
date "+%m/%d/%y %H:%M"
++ date '+%m/%d/%y %H:%M'
+ DATE='02/01/11 12:54'
+ PJ=
+ CMD='-azurLptq -e ssh -i /root/.ssh/transfer --progress --exclude=*SEG* --exclude=*blablabla* /images/RESTORE_2/generated_data user@my.remote_server.com:/data/RES'
echo rsync $CMD
++ echo rsync -azurLptq -e ssh -i /root/.ssh/transfer --progress '--exclude=*BLABLAAAAAAA/

On voit deja plus haut que les " " ont disparus de la commande

user@my.remote-server.com's password:

ssh -i /root/.ssh/transfer user@my.remote-server.com date
Tue Feb 1 04:10:54 PST 2011

Donc on exclue le probleme de conenxion ssh clé ou autre c'est bien un souci de scripting :(

De même le fichier généré (le CSV) contient la ligne suivante:
KO;02/01/11 12:54;;test-script.sh;-azurLptq -e ssh -i /root/.ssh/transfer --progress --exclude=*blablabla /data/RES/blabla user@my.remote-server.com:/data/res/

on constate la encore que les "" relatifs a la commande ssh ont encore disparus!! les bougres!

Donc si quelqu'un a une idée je suis tout preneur
  • # execution dans le shell ou dans un sous-shell et/ou echappement

    Posté par  . Évalué à 1.

    tu peux deja tenter d'echapper les caracteres pour qu'il ne soit pas interpreté dans le shell courant.
    my_rsync.sh \"mon premier argument\" ...
    tu peux aussi ajouter les "" dans le script final (dans my_rsync)

    sinon tu dois pouvoir jouer des shells et sous shell
    ${ un truc a lancer dans un sous-shell }
  • # Euh

    Posté par  (site web personnel) . Évalué à 6.

    >le problème c'est qu'il est difficil de savoir si chaque commande rsync a
    >bien fonctionner ou non et pourtant, c'est primordial.

    Je comprend pas ton problème là, si rsync chie dans la colle il va te le dire, donc avec un contab, tu dois recevoir un mail avec l'erreur en question... non ? Enfin ici ca tourne comme cela...
  • # Simplement

    Posté par  (site web personnel) . Évalué à 2.

    rsync -avz --delete-after -e "ssh -i /root/.ssh/toto.key" /etc/ root@IP:/etc/ && echo "Succès: Backup || echo "Echec Backup

    Si la commande Rsync est finalement ok elle envoie la première commande sinon la deuxième, à partir de ça tu peux imaginer n'importe quoi comme retour, un mail par exemple.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.