IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Exécuter une variable en tant que commande


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut Exécuter une variable en tant que commande
    Bonjour à tous.

    J’utilise la commande rsync pour synchroniser mes serveurs, et j’aimerai exclure des répertoires. Du coup j’ai crée une table en bdd dans laquelle je rajoute chaque répertoire exclut.
    Du coup je concatène les exclusions comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exc="—exclude a —exclude b ..."
    Mais ensuite ma commande fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -avz —delete-after "$exc" "ssh root@192.168.100.150" repa/ repb/
    Comment faire pour que la variable exc soit interpretee dans le rsync ?
    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    sans les guillemets ? pour que la variable ne soit pas vue par le shell comme un unique mot.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    En fait j’ai oublié une précision : exc peut être égal à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exc="—exclude \"a a a\" —exclude b ..."
    Je test sans guillemet dès que je suis devant le pc, merci

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Non ça ne fonctionne pas bien que je n'ai aucune erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo $exc
    --exclude "3" --exclude "d" --exclude "7" --exclude "d" --delete-exclude
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    rsync -avz —delete-after $exc "ssh root@192.168.100.150" repa/ repb/
    building file list ... done
     
    sent 240 bytes received 12 bytes 504.00 bytes/sec
    total size is 21 speedup is 0.08
    Normalement ici j'aurai du voir des suppressions de fichiers/répertoire mais rien ne se passe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    rsync -avz —delete-after --exclude "3" --exclude "d" --exclude "7" --exclude "d" --delete-exclude "ssh root@192.168.100.150" repa/ repb/
    building file list ... done
     
    deleting d/
    deleting 3
    deleting a/7
    deleting b/7/
    sent 202 bytes received 12 bytes 428.00 bytes/sec
    total size is 17 speedup is 0.08
    Du coup en mettant le contenu de "exc" directement ça fonctionne.. une autre idée ?

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    N'y a-t-il pas des informations sur le canal d'erreurs ?

    Parce que --delete-exclude n'existe pas. C'est --delete-excluded. Non ?
    Et --exclude a pour syntaxe --exclude=MOTIF et pas --exclude MOTIF. Non ?

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Oui en effet, j'ai recopié la réponse de mon serveur comme je suis sous shellinabox (je ne peux pas copier/coller), et j'ai fait une faute sur "excluded".
    En revanche, pour le "--exclude=MOTIF" ça marche que ce soit avec espace ou égal.
    J'ai constaté que le problème vient des apostrophes :

    Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    COMMANDE="--exclude=d --exclude=t --delete-excluded"
    rsync -avz —delete-after $COMMANDE "ssh root@192.168.100.150" repa/ repb/
    La ça fonctionne !
    Mais le souci c'est que si mon répertoire contient des espaces ? Je suis obligé de mettre des quotes...

    Si je fais ceci, ça ne fonctionne plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COMMANDE="--exclude=\"d\" --exclude=\"t\" --delete-excluded"

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Bonjour,

    Et si tu te remets dans le contexte de départ et lance la commande comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval rsync -avz —delete-after "$exc" "ssh root@192.168.100.150" repa/ repb/
    Et pour simplifier, au lieu de faire \"a a a\", tu peux faire 'a a a' car il n'est pas utile de protéger les simples quotes à l'intérieur des doubles quotes et vice-versa.

    Par contre, pour que le simple ou double quote soit vu comme délimiteur et non comme simple caractère dans une variable, il faut évaluer la dite variable.

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Et oui mais comme ma variable est ajoutée "dynamiquement", les simpes quotes ne vont pas remplacer la variable ?
    Voici le code complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #récupération en BDD
    #    chaque repertoire/fichier séparé par des virgules
    #    si _0 pas de suppression, si _1 ajout de la suppression
    EXCLUDE="3,d,7,b,mon rep_1"
    FICHIER=`echo "$EXCLUDE" | cut -d "_" -f1`
    SUPPRIMER=`echo "$EXCLUDE" | cut -d "_" -f2`
    IFS=$'\n'
    unset COMMANDE
    for FILE in `echo "$FICHIER" | tr "," "\n"`
    do
        COMMANDE="${COMMANDE} --exclude=\"$FILE\"" # si j'enleve les \" je ne pourrai pas mettre d'espace et si je mets des simples quotes $FILE sera interprété comme tel et non comme la variable ?
    done
    unset IFS
    if [ "$SUPPRIMER" == "1" ]
    then
        COMMANDE="${COMMANDE} --delete-excluded"
    fi
    #commande
    # echo $COMMANDE
    # --exclude="3" --exclude="d" --exclude="7" --exclude="b" --exclude="mon rep" --delete-excluded
    rsync -avz --delete-after $COMMANDE -e "ssh root@192.168.100.150" repa/ repb/

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Ah j'ai l'impression qu'en mettant "eval" devant ça fonctionnneeeee !!!

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    oui, ça fonctionne mais attention aux effet de bord, par exemple:

    on veut obtenir l'équivalent de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ for i in titi 'tutu toto' tata ; do echo $i ; done
    titi
    tutu toto
    tata
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ var="titi 'tutu toto' tata"
    $ for i in $var ; do echo $i ; done
    titi
    'tutu
    toto'
    tata
    fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ for i in "$var" ; do echo $i ; done
    titi 'tutu toto' tata
    fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ eval "for i in $var ; do echo \$i ; done"
    titi
    tutu toto
    tata
    fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ XX="for i in $var ; do echo \$i; done"
    $ eval "$XX"
    titi
    tutu toto
    tata
    fonctionne
    Dans les 2 cas qui fonctionnent ici, on doit protéger l'encodage de $i contre eval car la variable est contruite dans le script lui-même, elle n'est pas externe contrairement à $var.

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Non j'ai parlé un peu vite, ça ne fonctionne pas avec "eval" et avec ou sans quotes sur la variable COMMANDE :
    j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Unexpected remote arg: root@192.168.100.150:/repa
    rsync error: syntax or usage error (code 1) at main.c(1402) [sender=3.0.9]

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Et que donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval "rsync -avz --delete-after $COMMANDE -e 'ssh root@192.168.100.150' repa/ repb/"
    ou plus securisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bash -c "rsync -avz --delete-after $COMMANDE -e 'ssh root@192.168.100.150' repa/ repb/"

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Ah je suis parti là.
    Je regarderai lundi merci pour ton aide.

  14. #14
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Et que donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval "rsync -avz --delete-after $COMMANDE -e 'ssh root@192.168.100.150' repa/ repb/"
    ou plus securisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bash -c "rsync -avz --delete-after $COMMANDE -e 'ssh root@192.168.100.150' repa/ repb/"
    Ça fonctionne parfaitement !
    Merci beaucoup !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/05/2014, 14h16
  2. Réponses: 1
    Dernier message: 23/07/2009, 21h14
  3. utilisation d"une variable en tant que motif de
    Par bilout dans le forum Langage
    Réponses: 4
    Dernier message: 26/03/2006, 20h19
  4. [FTP] Définir une variable en tant que constante
    Par Anduriel dans le forum Langage
    Réponses: 2
    Dernier message: 15/01/2006, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo