OVH Cloud OVH Cloud

expect

13 réponses
Avatar
Rémi Moyen
Salut,

Je suis en train d'essayer de jouer avec expect pour automatiser une
série de transferts par ftp, mais je n'arrive guère qu'à m'énerver en
cherchant vainement comme ça marche...

J'ai regardé le man, mais il est (comme souvent avec les man...)
inutilisable pour apprendre à utiliser expect. Et j'ai pas trouvé de doc
satisfaisante sur le net. En particulier, je suis surpris de l'absence
de doc sur la page principale d'expect (expect.nist.gov), mais bon, passons.

Ce que je n'arrive pas du tout à faire, c'est à récupérer dans des
variables d'expect le résultat de commandes précédentes envoyées par
send. Par exemple, je voudrais récupérer dans toto le contenu de la
variable d'environnement du shell $TOTO, par un truc style :

spawn bash
expect "$ "
send "echo \$TOTO\r"
expect "$ "
set toto $expect_out(1,string)
send "exit\r"
expect eof
# toto devrait contenir la valeur de $TOTO

Sauf que ça marche pas du tout. En fait, je ne capte que dalle à
qu'est-ce qui est stocké dans expect_out et comment le contrôler... Si
je fais 'set toto $expect_out(buffer)', je récupère :
"echo $TOTO

blop

$ "
c'est à dire ma commande lancée par send puis tout jusqu'au expect
suivant. Bon. Mais si j'essaye de matcher différents morceaux de cette
sortie avec expect -re "(.*)$ ", par exemple, ben $expect_out(1,string)
me retourne une erreur (can't read "expect_out(1,string)": no such
element in array). J'ai essayé plein d'autres motifs plus ou moins
compliqués, mais sans plus de succès.

Grrr... Ce truc m'énerve...
--
Rémi Moyen

3 réponses

1 2
Avatar
Stephane Chazelas
On Sun, 13 Nov 2005 19:04:45 +0100, Rémi Moyen wrote:
[...]
#!/usr/bin/expect -f

set prompt "$ " ;# our shell or whatever prompt we have
set command "date" ;# the command whose output we want to catch
spawn bash ;# spawn the bash


spawner bash n'est pas une bonne idee. bash utilisant readline
n'est pas forcement tres expectable.

expect "$prompt" ;# wait for prompt
send "$commandr" ;# send command


spawn la commande directement.

Et pour des commandes aussi simples non-interactives, pas besoin
de spawn ni meme d'expect.

Avec expect:

set result [exec $command]

expect "$commandr" ;# discard command echo
expect -re "(.*)r" ;# match and save the result



Tu as oublié un "expect prompt"

#afficher le résultat
send "echo "result: $expect_out(1,string)"r"
expect "$prompt"



--
Stephane

Avatar
Rémi Moyen
On Sun, 13 Nov 2005 17:51:25 +0100, Rémi Moyen wrote:

Je suis en train d'essayer de jouer avec expect pour automatiser une
série de transferts par ftp, mais je n'arrive guère qu'à m'énerver en
cherchant vainement comme ça marche...

J'ai regardé le man, mais il est (comme souvent avec les man...)
inutilisable pour apprendre à utiliser expect.


[...]

Si tu lis le man dans l'ordre, tu verras qu'ils donnent des
conseils de lecture de la page de man.


Je sais, et j'ai suivi. Mais même comme ça, c'est très loin d'être
didactique.

C'est pas un reproche en soi, hein. Un manuel de référence, c'est pas la
même chose qu'un tutoriel, et je ne me plains pas que 'man' ne soit pas
forcément le meilleur des tutoriels. J'aurais bien regardé un tutoriel,
mais je n'en ai pas trouvé de satisfaisant.

Note qu'expect est un
interpreter TCL avec des fonctions de la libexpect. Tu voudras
peut-etre lire un manuel de TCL.


En fait, non. Pas que j'ai quelque chose contre TCL en soi, mais
simplement que j'ai pas envie d'apprendre tout un nouveau langage rien
que pour utiliser une commande qui va me servir une fois par mois. Je
sais, ça pourrait toujours me servir à d'autres moments/endroits, c'est
toujours intéressant, etc. Mais si ça me demande un tel investissement,
je préfère passer ce temps-là sur des choses qui m'amusent plus :-)
--
Rémi Moyen


Avatar
Rémi Moyen

expect "$prompt" ;# wait for prompt
send "$commandr" ;# send command



spawn la commande directement.


Ah, j'avais pas pensé à ça. Oui, c'est nettement plus simple.

Et pour des commandes aussi simples non-interactives, pas besoin
de spawn ni meme d'expect.


Voui, bien sûr, mais c'était juste un exemple. Je compte bien faire plus
que demander la date ou l'heure :-)

Avec expect:

set result [exec $command]


En effet, voila qui me simplifie bien les choses !!

expect "$commandr" ;# discard command echo
expect -re "(.*)r" ;# match and save the result




Tu as oublié un "expect prompt"


Hmmm... oui, mais ça ne règle pas vraiment mon problème, apparemment.
Bon, je vais regarder ça de plus près, là j'ai pas trop testé.

Merci pour ton aide !
--
Rémi Moyen


1 2