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 :

[ssh] Exécution de plusieurs commandes


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Par défaut [ssh] Exécution de plusieurs commandes
    Bonjour à tous,

    J'ai un petit soucis au niveau de la syntax d'une commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /usr/bin/ssh test@Test "mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/${d}_vmFreeNASStorage.img.old && rm `ls /data/xen/domains/vmFreeNAS/ |grep -v ${grepstatement} | grep '\>.img.old'`"
    avec "d" = $(date +%d-%m-%Y --date="1 weeks ago")
    et "grepstatement" = "'\<${d}'"

    Mon problème est que le ls est exécutée sur la machine local et non sur la machine distante.
    Dans ma commande, les doubles quotes sont utilisées uniquement pour grouper les commandes exécutées en ssh.

    Auriez vous une idée de la syntaxe à adopter pour palier à ce problème ?

    Merci !

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Cela devrait fonctionner en remplaçant les backquotes par $( ), et en échappant les $ :

    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/ssh test@Test "mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/${d}_vmFreeNASStorage.img.old && rm \$(ls /data/xen/domains/vmFreeNAS/ |grep -v \${grepstatement} | grep '\>.img.old')"

    Sinon, une autre solution serait d'utiliser des simple quotes :

    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/ssh test@Test "mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/${d}_vmFreeNASStorage.img.old && "'rm `ls /data/xen/domains/vmFreeNAS/ |grep -v ${grepstatement} | grep "\>.img.old"`'

    Ici j'ai utilisé le fait que deux chaînes de caractères côte à côte sans espaces entre les deux sont considérées comme une seule chaîne.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Par défaut
    Bonjour,

    Merci pour le coup de main!

    Avec les deux méthodes, la variable ${grepstatement) n'est plus interprétée comme une variable mais comme une chaîne, donc mon grep ne marche pas. Même lorsque j’échappe le $.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Spikedammage Voir le message
    Bonjour,

    Merci pour le coup de main!

    Avec les deux méthodes, la variable ${grepstatement) n'est plus interprétée comme une variable mais comme une chaîne, donc mon grep ne marche pas. Même lorsque j’échappe le $.
    Donc, pour résumer, les spécifications seraient que:

    Sur la machine locale, sont définies les 2 variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d=$(date +%d-%m-%Y --date="1 weeks ago")
    grepstatement="'\<${d}'"
    Le ls | grep doit être exécuté sur la machine distante.

    C'est bien ça?

    Plus précisément, la chaîne que tu recherches est-elle "'\<${d}'" ou bien '\<${d}' ou bien \<${d} ou bien <${d} ???

    Plus précisément encore, est-ce le caractère '\' suivi du caractère '<' ou bien une expression régulière pour dire "début de mot" ?

    Personnellement, ayant rencontré des comportements différents entre 'grep' et 'egrep', je tends à n'utiliser que fgrep ou egrep, mais aussi rarement que possible 'grep'.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Par défaut
    Le ls | grep doit être exécuté sur la machine distante.

    C'est bien ça?
    Tout à fait, je met sert de ce que me renvoie le ls | grep comme argument pour la commande rm. Le tout devant être exécuté sur la machine distante.

    Plus précisément, la chaîne que tu recherches est-elle "'\<${d}'" ou bien '\<${d}' ou bien \<${d} ou bien <${d} ???

    Plus précisément encore, est-ce le caractère '\' suivi du caractère '<' ou bien une expression régulière pour dire "début de mot" ?
    Le "\<" correspond bien à une regex signifiant "début du mot". Et le pattern que je cherche dans le début du mot est le contenu de la variable ${d}, autrement dit, la date actuelle - une semaine.

    Personnellement, ayant rencontré des comportements différents entre 'grep' et 'egrep', je tends à n'utiliser que fgrep ou egrep, mais aussi rarement que possible 'grep'.
    La commande ls|grep fonctionne parfaitement lorsque je l’exécute depuis le serveur distant.

    Le problème actuel est que lorsque je l'exécute à distance:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/ssh test@Test "mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/${d}_vmFreeNASStorage.img.old && rm `ls /data/xen/domains/vmFreeNAS/ |grep -v ${grepstatement} | grep '\>.img.old'`"
    les variables $d et $grepstatement sont bien remplacées par leurs valeurs, mais le rm et le ls s’exécutent en local.

    Lorsque j’exécute les solutions apportées par Julien Sanchez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /usr/bin/ssh test@Test "mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/${d}_vmFreeNASStorage.img.old && rm \$(ls /data/xen/domains/vmFreeNAS/ |grep -v \${grepstatement} | grep '\>.img.old')"
    ou
    /usr/bin/ssh test@Test "mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/${d}_vmFreeNASStorage.img.old && "'rm `ls /data/xen/domains/vmFreeNAS/ |grep -v ${grepstatement} | grep "\>.img.old"`'
    Les commande rm et ls s'éxecutent bien sur le serveur distant mais la variable ${grepstatement} est interprétée comme une chaîne de caractère et n'est donc pas remplacée par sa valeur.

    Le problème se trouve au niveau de la syntax des " ' et des caractères à échapper je pense.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Mets tes variables et tes commandes dans un script exécutable en local et lances ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/ssh test@Test '/bin/bash -s' < ./ton_script.sh
    PS. J'ai mis "/bin/bash" comme shell, donc à adapter si besoin et vérifier que l'option "-s" est accessible...

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Dans ce cas, il vaut peut-être mieux partir de simples quotes un peu partout... sauf pour les variables, ce qui donne la très lisible chaîne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /usr/bin/ssh test@Test \
    'mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/'"${d}"\
    '_vmFreeNASStorage.img.old && rm $(ls /data/xen/domains/vmFreeNAS/ | egrep -v '\
    "${grepstatement}"' | egrep '"'"'\>.img.old'"'"')'
    ou
    /usr/bin/ssh test@Test \
    'mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/'"${d}"\
    '_vmFreeNASStorage.img.old && rm `ls /data/xen/domains/vmFreeNAS/ | egrep -v '\
    "${grepstatement}"' | grep '"'"'\>.img.old'"'"'`'
    Tu dois aussi pouvoir simplifier en remplaçant rm $(ls) par ls | xargs rm qui àmha doit être assez équivalent (c'est-à-dire qui échoue de la même manière sur les fichiers dont les noms contiennent des caractères spéciaux (comme espaces, tabulations, returns...)).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /usr/bin/ssh test@Test \
    'mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/'"${d}"\
    '_vmFreeNASStorage.img.old && ls /data/xen/domains/vmFreeNAS/ | egrep -v '\
    "${grepstatement}"' | fgrep .img.old | xargs rm'
    Attention! La place des "\ return" est très réglementée!
    J'ai simplifié la dernière en utilisant fgrep pour échapper les '.' (si c'est bien ce que tu veux faire)

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 50
    Par défaut
    Citation Envoyé par Spikedammage Voir le message
    la variable ${grepstatement) n'est plus interprétée comme une variable mais comme une chaîne
    Dans ce cas, il ne faut pas échapper le $ du ${grepstatement} :

    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/ssh test@Test "mv /data/xen/domains/vmFreeNAS/vmFreeNASStorage.img /data/xen/domains/vmFreeNAS/${d}_vmFreeNASStorage.img.old && rm \$(ls /data/xen/domains/vmFreeNAS/ |grep -v ${grepstatement} | grep '\>.img.old')"

Discussions similaires

  1. Exécution de plusieurs commandes DOS en java
    Par tomzdi dans le forum Général Java
    Réponses: 3
    Dernier message: 03/07/2013, 19h27
  2. [SSH] Exécuter plusieurs commandes à distance
    Par tck-lt dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/04/2011, 17h13
  3. Réponses: 10
    Dernier message: 03/04/2008, 15h58
  4. [SSH2] Exécution de plusieurs commandes
    Par kneiss dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 06/03/2008, 18h07
  5. Exécuter plusieurs commandes bat
    Par n@n¤u dans le forum Langage
    Réponses: 4
    Dernier message: 31/08/2006, 15h23

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