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

10 réponses

1 2
Avatar
Jean-Louis Liagre
Rémi Moyen wrote:
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...


curl et wget sont probablement plus appropriés.

[...]
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 $TOTOr"
[...]


essaie:

send "echo $env(TOTO)r"

Avatar
Rémi Moyen

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...



curl et wget sont probablement plus appropriés.


Bah, en fait, c'est pas vraiment du ftp, c'est captive-ntfs (le truc
pour écrire sur des partitions ntfs), qui marche avec une interface à la
ftp (et aussi potentiellement de manière transparente en mount avec
lufs, mais lufs ne marche pas chez moi).

Et puis c'est aussi l'occasion d'essayer de jouer un peu avec expect,
depuis le temps que j'en entends parler.

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 $TOTOr"
[...]



essaie:

send "echo $env(TOTO)r"


Hum, oui, c'est en effet plus simple pour récupérer une variable. Merci,
ça va déjà bien m'aider pour pas mal de choses !

Mais en fait, mon problème est plus vaste (je pensais que cet exemple
suffirait, mais visiblement c'est trop simple :-) ). Si, par exemple, je
veux récupérer la sortie d'un 'grep motif fichier', je fais comment ?

Évidemment, je peux jouer au bourrin et faire un script shell qui règle
une variable à partir de mon grep puis qui lance un script expect qui
utilise cette variable, mais, euh, comment dire... beurk.
--
Rémi Moyen


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...


En continuant à fouiller, j'ai trouvé un bout de tutorial ici :
http://wiki.tcl.tk/2958

Mais si je fais le script suivant, en suivant leurs commandes :
#!/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
expect "$prompt" ;# wait for prompt
send "$commandr" ;# send command
expect "$commandr" ;# discard command echo
expect -re "(.*)r" ;# match and save the result

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

J'obtiens en sortie :
$ ./expect_cp_music
spawn bash
$ date
dim nov 13 18:57:53 CET 2005
echo "result:
dim nov 13 18:57:53 CET 2005"
$ echo "result:
exit
dim nov 13 18:57:53 CET 2005"
result:

dim nov 13 18:57:53 CET 2005
$ exit
exit
$

Ce qui montre que d'une part y'a un expect qui merde (pour qu'il
collisionne le send "echo ..." avec le send exit...), mais surtout que
expect_out contient aussi un saut de ligne au début !! D'autres essais
me confirment ça, et du coup le résultat est inutilisable (typiquement,
je ne peux pas faire un send "touch $expect_out(...)", parce que le
shell reçoit "touch [return] [contenu de expect_out]").

Mais si je mets dans le expect "r(.*)r" (pour enlever le premier saut
de ligne), j'ai une erreur. Et à la limite, c'est assez normal vu que le
saut de ligne est déjà éliminé par le expect "$commandr". Mais ça ne me
dit pas comment faire...

Buh ?
--
Rémi Moyen

Avatar
Thierry Boudet
On 2005-11-13, Jean-Louis Liagre 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...


curl et wget sont probablement plus appropriés.

Attention, je suis tombé il y a deux mois sur (j'en suis presque

sur) un bug de wget assez vicieux, qui m'a fait galérer deux heures:

http://tontonth.free.fr/bug-wget.txt

J'ai envoyé un bugreport, mais je ne sais pas où ça en est. Donc,
méfiance avec wget dans certains cas tordus...


--
Quand on s'approche exprès de la cage aux singes, faut pas se plaindre
quand on se fait tirer la banane.


Avatar
[SauronDeMordor]
On 2005-11-13, Jean-Louis Liagre 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'éne rver en
cherchant vainement comme ça marche...


curl et wget sont probablement plus appropriés.



Attention, je suis tombé il y a deux mois sur (j'en suis presque
sur) un bug de wget assez vicieux, qui m'a fait galérer deux heure s:

http://tontonth.free.fr/bug-wget.txt

J'ai envoyé un bugreport, mais je ne sais pas où ça en est. Do nc,
méfiance avec wget dans certains cas tordus...


pour les transferts de ftp automatique, il y a plus simple que expect qui parfois a des reponses "bizares".


des clients "inteligents" comme yafc, ncftp, ou lftp te permettent descri pter des transferts ftp.



Avatar
Thierry Boudet
On 2005-11-15, [SauronDeMordor] wrote:

Attention, je suis tombé il y a deux mois sur (j'en suis presque
sur) un bug de wget assez vicieux, qui m'a fait galérer deux heures:

http://tontonth.free.fr/bug-wget.txt

J'ai envoyé un bugreport, mais je ne sais pas où ça en est. Donc,
méfiance avec wget dans certains cas tordus...


pour les transferts de ftp automatique, il y a plus simple que

expect qui parfois a des reponses "bizares".



En l'occurence, le bug se manifestait sur du http.

des clients "inteligents" comme yafc, ncftp, ou lftp te permettent
descripter des transferts ftp.


ncftpget exactement.

--
"Les mégahertz, c'est comme la cylindrée : c'est pas parce que t'as la
Renault Fuego que tu peux rouler plus vite qu'avec la Méhari sur la
route des monts plots."


Avatar
Chris
[SauronDeMordor] wrote:

On 2005-11-13, Jean-Louis Liagre 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...



curl et wget sont probablement plus appropriés.



Attention, je suis tombé il y a deux mois sur (j'en suis presque
sur) un bug de wget assez vicieux, qui m'a fait galérer deux heures:

http://tontonth.free.fr/bug-wget.txt

J'ai envoyé un bugreport, mais je ne sais pas où ça en est. Donc,
méfiance avec wget dans certains cas tordus...


pour les transferts de ftp automatique, il y a plus simple que expect

qui parfois a des reponses "bizares".

des clients "inteligents" comme yafc, ncftp, ou lftp te permettent
descripter des transferts ftp.


Sinon perl Net::FTP est tres tres bien j'ai automatiser l'envoi
quotidien de de 30 sites sur un serveur de petit fichier
L'interet est de pouvoir diagnostiquer toute les etapes
connexion
utilisateur/mot de passe
presence ou non de fichier
probleme a la copie
modif des droits
etc...

A+
chris




Avatar
Mehdi BENKIR
Rémi Moyen wrote:

Buh ?


autoexpect(1)

Avatar
Rémi Moyen
Rémi Moyen wrote:

Buh ?



autoexpect(1)


Hmm...
J'avoue ne pas avoir été regarder en détail, mais je ne pense pas que ça
m'aide vraiment : je ne cherche pas à reproduire une session donnée
(aussi complexe soit-elle), mais à générer des sessions paramétrées par
des variables (du shell) et qui explorent une arborescence.

En fait, ce que je fait pour l'instant (en attendant de trouver
mieux...), c'est un script shell du style :

#!/bin/bash

#une série de commandes pour explorer mon arborescence,
#selectionner certains fichiers, stocker tout ça dans :
VAR1=...
VAR2=...

cat << EOF > /tmp/script_expect.tmp
#!/usr/bin/expect -f

spawn...
expect...
#en utilisant $VAR1, $VAR2, ...
EOF

chmod u+x /tmp/script_expect.tmp
/tmp/script_expect.tmp
rm /tmp/script_expect.tmp

Mais je trouve ça assez moche, et en plus c'est pas du tout efficace,
parce que mon expect se trouve dans une boucle for répétée pas mal de
fois et que du coup je lance une nouvelle session de mon truc ftp-like à
chaque fois... Bon, je pourrais optimiser les choses en écrivant un seul
gros script expect, c'est vrai. Mais je trouve quand même moche d'être
obligé de passer par un script shell pour générer un script expect...

Enfin bon, je vais regarder de plus près autoexpect : peut-être que
c'est malgré tout la réponse à mon problème !!
--
Rémi Moyen


Avatar
Stephane Chazelas
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. Note qu'expect est un
interpreter TCL avec des fonctions de la libexpect. Tu voudras
peut-etre lire un manuel de TCL. TCL est un language assez
pratique et straightforward assez bien concu (en tout cas
infiniment mieux que le shell).

--
Stephane

1 2