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 POSIX Discussion :

Comment passer et lire une variable Shell dans un expect ?


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut Comment passer et lire une variable Shell dans un expect ?
    Bonjour,

    je lance dans mon script shell un expect pour faire du SFTP.
    J'utilise dans cet expect une variable shell mais une fois dans l'expect elle n'est plus reconnue. Le message

    sftp> cd /sldbfil2/data/mutualise/out/tms/TgtFiles/JTMSi
    Couldn't canonicalise: No such file or directory
    Ici c'est le "i" de JTMSi qui devrait être remplacé par la valeur de la variable $i, "F" en l'occurence.

    Voici le script :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    else   
      for i in ${cube[@]}
      do
        case "$i" in 
          "F"|"E"|"M"|"Q")
            cd /home/ess_tms/temp/JTMS$i
     
    #Début du script SFTP sous expect
    /usr/bin/expect <<'EOF'
    set timeout 5
    set USER user
    set PASS datastage
    set HOST host
    #positionnement dans le répertoire source du serveur Informatica où les fichiers sont présents
    set INF_PATH_OUT /sldbfil2/data/mutualise/out/tms/TgtFiles
    spawn sftp $USER@$HOST
    expect password:
    send "$PASS\r"
        
    expect sftp>
    #Positionnement dans le dossier où le fichiers doivent être déposés par le STFP et à partir duquel le .ksh doit être exéxuté
    send "cd $INF_PATH_OUT/JTMSi\r" 
         
    expect sftp>
    send "get *.txt\r"
     
    expect sftp>
    send "exit\r"
    EOF
     
            rm -f /home/ess_tms/temp/JTMS$i/*.gz
            mv /home/ess_tms/temp/JTMS$i/TMSMDAI.txt /home/ess_tms/temp/JTMS$i/DB_IND.txt
    C'est ligne 22 que ça plante.

    Savez vous dans ce cas somment faire pour que dans mon expect il lise bien la valeur de "$i" définie plus haut dans le shell ?

    J'ai lu quelque part un truc comme
    in the expect script:
    replace $HOSTNAME with $env(HOSTNAME)
    http://www.linuxmisc.com/12-unix-she...7163351024.htm
    mais j'ai essayé et çà fonctionne pas. Peut être je l'utilise mal aussi ?

    Merci !

  2. #2
    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
    Pour les messages d'erreur, il vaut utiliser la balise CODE plutôt que QUOTE (c'est plus simple pour ceux qui répondent).

    Citation Envoyé par mederik Voir le message
    C'est ligne 22 que ça plante.

    Savez vous dans ce cas somment faire pour que dans mon expect il lise bien la valeur de "$i" définie plus haut dans le shell ?
    Ben oui. Il suffit de mettre un dollar devant le i

    En fait, dans le texte entre '<<EOF' et 'EOF', les variables sont expansées.

    (Le problème survient généralement dans l'autre sens: quand on veut un caractère '$', il faut le quoter avec un backslash.)

  3. #3
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    Ben oui. Il suffit de mettre un dollar devant le i
    Ben je veux pas me montrer désobligeant mais je me fais encore jeter.

    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
    23
    24
    25
    #Début du script SFTP sous expect
    /usr/bin/expect <<'EOF'
    set timeout 5
    set USER user
    set PASS datastage
    set HOST host
    #positionnement dans le répertoire source du serveur Informatica où les fichiers sont présents
    set INF_PATH_OUT /sldbfil2/data/mutualise/out/tms/TgtFiles
    spawn sftp $USER@$HOST
    expect password:
    send "$PASS\r"
        
    expect sftp>
    #Positionnement dans le dossier où le fichiers doivent être déposés par le STFP et à partir duquel le .ksh doit être exéxuté
    send "cd $INF_PATH_OUT/JTMS$i\r" 
         
    expect sftp>
    send "get *.txt\r"
     
    expect sftp>
    send "exit\r"
    EOF
     
            rm -f /home/ess_tms/temp/JTMS$i/*.gz
            mv /home/ess_tms/temp/JTMS$i/TMSMDAI.txt /home/ess_tms/temp/JTMS$i/DB_IND.txt
    et le message d'erreur :
    sftp> can't read "i": no such variable
    while executing
    "send "cd $INF_PATH_OUT/JTMS$i\r" "

  4. #4
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    En fait c'est vraiment sur le $i que y'a un prob.
    parce que si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    expect sftp>
    send "echo \"le chemin : $INF_PATH_OUT\""
    il me retourne la bonne valeur de variable mais en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    expect sftp>
    send "echo \"le i : $i\""
    il me renvoit
    can't read "i": no such variable while executing "send "echo \"le i : $i\"""
    Je pense que c'est parce que $INF_PATH_OUT est défini dans l'expect avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set INF_PATH_OUT /sldbfil2/data/mutualise/out/tms/TgtFiles
    et que le $i lui l'est seulement dans le ksh plus haut.

    Bref un probleme de variable locale et gloable ?

  5. #5
    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
    Voici un exemple qui explique clairement ce qui ne va pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ i=3
    $ cat <<EOF
    > coucou $i
    > EOF
    coucou 3
     
    $ cat <<'EOF'
    > coucou $i
    > EOF
    coucou $i
    En mettant EOF entre quotes, tu "neutralises" l'expansion des variables!
    Du coup, '$i' reste '$i' (un peu comme si tu faisais echo '$i').
    Si tu veux l'expansion de la variable $i, il faut retirer les quotes autour de EOF.

    Mais, du coup, tu tombes sur le problème que j'avais mentionné entre parenthèses:
    il faut quoter les $ devant les variables expect, ce qui donne:
    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
    #Début du script SFTP sous expect
    /usr/bin/expect <<EOF
    set timeout 5
    set USER user
    set PASS datastage
    set HOST host
    #positionnement dans le répertoire source du serveur Informatica où les fichiers sont présents
    set INF_PATH_OUT /sldbfil2/data/mutualise/out/tms/TgtFiles
    spawn sftp \$USER@\$HOST
    expect password:
    send "\$PASS\r"
     
    expect sftp>
    #Positionnement dans le dossier où le fichiers doivent être déposés par le STFP et à partir duquel le .ksh doit être exéxuté
    send "cd \$INF_PATH_OUT/JTMS${i}\r" 
     
    expect sftp>
    send "get *.txt\r"
     
    expect sftp>
    send "exit\r"
    EOF
    PS: j'aime autant mettre des accolades autour des noms de variables shell.

  6. #6
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    Je comprends vraiment plus rien...
    Parce que je l'avais essayé cette configuration où je virais les quotes sur EOF. La seule différence avec ton script c'est que je ne mettais pas les {}. Donc je les ai rajouté bien qu'elles semblent optionnelles si je lis bien entres les lignes.

    Sauf que ça fonctionne toujours pas ainsi. C'est ca qui me perturbe beaucoup en shell. C'est que le codage et la manière de faire semble varier selon que l'on introduise une subtile différence.

    Enfin je sais pas comment expliquer ce ressenti. Je te jure que ma partie Expect SFTP est la 1ère chose qui ai fonctionné au début; tout en étant à l'origine précédé d'un ksh. Bien qu'il fut plus léger que celui la maintenant.

    Donc comme l'expect fonctionnait, j'ai repri la partie OK et glissée à la suite du ksh modifié mais le fait d'avoir changé le ksh a fait que le script expect ne fonctionnait plus tel quel.

    Bref je comprends plus rien et à chaque fois que je pense avoir compris et pouvoir m'appuyer sur du solide, ça s'avère faux.

    Bref, en ayant fait ce que tu me dis c'est à dire
    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
    23
    24
    25
    26
    Début du script SFTP sous expect
    /usr/bin/expect <<EOF
    set timeout 5
    set USER user
    set PASS datastage
    set HOST host
     
    #positionnement dans le répertoire source du serveur datastage où les fichiers sont présents
    set INF_PATH_OUT /sldbfil2/data/mutualise/out/tms/TgtFiles
    spawn sftp $USER@$HOST
    expect password:
    send "$PASS\r"
        
    expect sftp>
    #Positionnement dans le dossier où le fichiers doivent être déposés par le STFP et à partir duquel le .ksh doit être exéxuté
    send "cd $INF_PATH_OUT/JTMS${i}\r" 
         
    expect sftp>
    send "get *.txt\r"
     
    expect sftp>
    send "exit\r"
    EOF
     
            rm -f /home/ess_tms/temp/JTMS$i/*.gz
            mv /home/ess_tms/temp/JTMS$i/TMSMDAI.txt /home/ess_tms/temp/JTMS$i/DB_IND.txt
    j'ai maintenant un nouveau message d'erreur :
    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
     
    spawn sftp ess_tms@
    Missing hostname
    usage: sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
              [-D sftp_server_path] [-F ssh_config] [-i identity_file]
              [-o ssh_option] [-P port] [-R num_requests] [-S program]
              [-s subsystem | sftp_server] host
           sftp [user@]host[:file ...]
           sftp [user@]host[:dir[/]]
           sftp -b batchfile [user@]host
    send: spawn id exp4 not open
        while executing
    "send "\r""
    mv: cannot rename /home/ess_tms/temp/JTMSF/TMSMDAI.txt to /home/ess_tms/temp/JTMSF/DB_IND.txt:
    No such file or directory
    En fait, je viens de le voir, pour la variable $USER définie en ligne 4, lorsque elle est appellée "spawn sftp $USER@$HOST" en ligne 9, elle est valorisée à "ess_tms@" sans le host en plus !!!

    Or "ess_tms" (Cf ligne 2 message d'erreur) ce n'est pas la valeur définie en ligne 4 mais correspond au user avec lequel je me suis connecté et qui lance le script.

    Je comprends PLUS !!! Ce n'était jamais arrivé. Ca, ça a toujours fonctionné. J'ai toujours pu me connecter. Et là je comprends pas pourquoi ça fonctionne plus et ce que j'ai bien pu faire ou défaire pour que ça se passe ainsi maintenant.

    J'en ai marre.

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

Discussions similaires

  1. Lire une variable php dans un script xml
    Par masterkenobi dans le forum Langage
    Réponses: 9
    Dernier message: 27/10/2010, 13h15
  2. IF sur une variable SHELL dans un bout de SQL
    Par nicolas.pailheret dans le forum Linux
    Réponses: 4
    Dernier message: 15/05/2009, 14h15
  3. Comment stocker en "dur" une variable saisie dans un textbox ?
    Par philoflore dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/08/2008, 23h13
  4. comment passer plus d'une variable dans une URL
    Par death_style dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2007, 22h57
  5. Réponses: 3
    Dernier message: 02/10/2006, 21h20

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