autoexpect - manuel de référence, options, exemples de commandes


NOM

autoexpect - générer un script Expect en regardant une session

SYNOPSIS

autoexpect [ args ] [ program args... ]

INTRODUCTION

autoexpect vous regarde interagir avec un autre programme et crée un script Expect qui reproduit vos interactions. Pour les scripts linéaires, autoexpect permet de gagner un temps considérable par rapport à l'écriture de scripts à la main. Même si vous êtes un expert Expect, vous trouverez pratique d'utiliser autoexpect pour automatiser les parties les plus stupides des interactions. Il est beaucoup plus facile de couper/coller ensemble des blocs de scripts d'attente automatique que de les écrire à partir de zéro. Et si vous êtes un débutant, vous pourrez peut-être vous en sortir en n'apprenant rien de plus sur Expect que sur la façon d'appeler autoexpect.

La façon la plus simple d'utiliser autoexpect est de l'appeler depuis la ligne de commande sans arguments. Par exemple:

autoexpect

Par défaut, autoexpect génère un shell pour vous. Étant donné un nom de programme et des arguments, autoexpect génère ce programme. Par exemple:

autoexpect ftp ftp.cme.nist.gov

Une fois que votre programme généré est en cours d'exécution, interagissez normalement. Lorsque vous avez quitté le shell (ou le programme que vous avez spécifié), autoexpect créera un nouveau script pour vous. Par défaut, autoexpect écrit le nouveau script dans "script.exp". Vous pouvez remplacer cela avec l'indicateur -f suivi d'un nouveau nom de script.

L'exemple suivant exécute "ftp ftp.cme.nist.gov" et stocke le script Expect résultant dans le fichier "nist".


	autoexpect -f nist ftp ftp.cme.nist.gov

Il est important de comprendre qu'autoexpect ne garantit pas un script fonctionnel car il doit nécessairement deviner certaines choses - et parfois il se trompe. Cependant, il est généralement très facile d'identifier et de résoudre ces problèmes. Les problèmes typiques sont :

1.

Horaire. Un nombre étonnamment élevé de programmes (rn, ksh, zsh, telnet, etc.) et de périphériques (par exemple, les modems) ignorent les frappes qui arrivent "trop rapidement" après les invites. Si vous trouvez votre nouveau script suspendu à un endroit, essayez d'ajouter un court sommeil juste avant l'envoi précédent.

Vous pouvez forcer ce comportement partout en remplaçant la variable "force_conservative" près du début du script généré. Ce mode "conservateur" fait que l'attente automatique s'arrête automatiquement brièvement (un dixième de seconde) avant d'envoyer chaque caractère. Cela apaise tous les programmes que je connais.

Ce mode conservateur est utile si vous voulez simplement vous rassurer rapidement que le problème est un problème de synchronisation (ou si vous ne vous souciez vraiment pas de la vitesse d'exécution du script). Ce même mode peut être forcé avant la génération du script en utilisant l'indicateur -c.

Heureusement, ces taches de chronométrage sont rares. Par exemple, telnet ignore les caractères uniquement après avoir entré sa séquence d'échappement. Les modems n'ignorent les caractères qu'immédiatement après s'être connectés pour la première fois. Quelques programmes présentent ce comportement tout le temps mais ont généralement un commutateur pour le désactiver. Par exemple, l'indicateur -T de rn désactive ce comportement.

L'exemple suivant démarre autoexpect en mode conservateur.


	autoexpect -c

Le drapeau -C définit une clé pour basculer en mode conservateur. L'exemple suivant démarre autoexpect (en mode non conservateur) avec ^L comme bascule. (Notez que le ^L est entré littéralement - c'est-à-dire, entrez un vrai contrôle-L).


	autoexpect -C ^L

L'exemple suivant démarre autoexpect en mode conservateur avec ^L comme bascule.


	autoexpect -c -C ^L
2.

En écho. De nombreux caractères d'écho de programme. Par exemple, si vous tapez "more" dans un shell, ce que l'attente automatique voit réellement est :


	you typed 'm',
	computer typed 'm',
	you typed 'o',
	computer typed 'o',
	you typed 'r',
	computer typed 'r',
	...

Sans connaissance précise du programme, il est impossible de savoir si vous attendez de voir chaque caractère en écho avant de taper le suivant. Si autoexpect voit des caractères en écho, il suppose qu'il peut tous les envoyer en tant que groupe plutôt que de les entrelacer tels qu'ils sont apparus à l'origine. Cela rend le script plus agréable à lire. Cependant, cela pourrait être incorrect si vous deviez vraiment attendre pour voir chaque caractère en écho.

3.

Changement. Autoexpect enregistre chaque caractère de l'interaction dans le script. Ceci est souhaitable car cela vous donne la possibilité de porter des jugements sur ce qui est important et ce qui peut être remplacé par une correspondance de modèle.

D'autre part, si vous utilisez des commandes dont la sortie diffère d'une exécution à l'autre, les scripts générés ne seront pas corrects. Par exemple, la commande "date" produit toujours une sortie différente. Ainsi, l'utilisation de la commande date lors de l'exécution d'autoexpect est un moyen sûr de produire un script qui nécessitera une modification pour qu'il fonctionne.

L'indicateur -p place autoexpect en "mode invite". Dans ce mode, autoexpect ne recherchera que la dernière ligne de sortie du programme - qui est généralement l'invite. Cela gère le problème de date (voir ci-dessus) et la plupart des autres.

L'exemple suivant démarre l'attente automatique en mode d'invite.


	autoexpect -p

L'indicateur -P définit une clé pour basculer en mode d'invite. L'exemple suivant démarre l'attente automatique (en mode sans invite) avec ^P comme bascule. Notez que le ^P est entré littéralement - c'est-à-dire, entrez un vrai contrôle-P.


	autoexpect -P ^P

L'exemple suivant démarre l'attente automatique en mode d'invite avec ^P comme bascule.


	autoexpect -p -P ^P

AUTRES DRAPEAUX

L'indicateur -quiet désactive les messages d'information produits par autoexpect.

L'indicateur -Q nomme un guillemet qui peut être utilisé pour saisir des caractères que l'attente automatique consommerait autrement car ils sont utilisés comme bascules.

L'exemple suivant montre un certain nombre d'indicateurs avec guillemets utilisés pour fournir un moyen d'entrer littéralement les bascules.


	autoexpect -P ^P -C ^L -Q ^Q

STYLE

Je ne sais pas s'il existe un "style" pour les programmes Expect, mais autoexpect ne doit certainement pas être considéré comme un modèle de style. Par exemple, autoexpect utilise des fonctionnalités d'Expect qui sont spécifiquement destinées aux scripts générés par ordinateur. N'essayez donc pas d'écrire fidèlement des scripts qui semblent avoir été générés par autoexpect. Ce n'est pas utile.

D'un autre côté, les scripts d'attente automatique montrent des choses intéressantes. Par exemple, vous pouvez voir comment n'importe quelle chaîne doit être entre guillemets afin de l'utiliser dans un script Tcl simplement en exécutant les chaînes via autoexpect.

VOIR ÉGALEMENT

"Exploring Expect: A Tcl-Based Toolkit for Automating Interactive Programs" by Don Libes, O'Reilly and Associates, January 1995.

AUTEUR

Don Libes, Institut national des normes et de la technologie

expect et autoexpect sont dans le domaine public. Le NIST et moi apprécierions le crédit si ces programmes ou parties d'entre eux sont utilisés.