Skip to main content

Attendez les instructions et exemples de commandes Linux / Unix

Créer et utiliser un partage NFS (Mai 2025)

Créer et utiliser un partage NFS (Mai 2025)
Anonim

Expect est un programme qui communique avec d’autres programmes interactifs selon un script. Après le script, Expect sait ce qu’on peut attendre d’un programme et quelle doit être la réponse correcte. Un langage interprété fournit des structures de contrôle de branchement et de haut niveau pour diriger le dialogue. En outre, l'utilisateur peut prendre le contrôle et interagir directement lorsque cela est souhaité, ce qui lui permet ensuite de reprendre le contrôle du script.

Expectk est un mélange d'Expect et de Tk. Il se comporte exactement comme le souhait d'Expect et de Tk. Expect peut également être utilisé directement en C ou C ++ sans Tcl.

Le nom "Expect" vient de l'idée de séquences send / expect popularisées par uucp, kermit et d'autres programmes de contrôle de modem. Cependant, contrairement à uucp, Expect est généralisé de sorte qu’il puisse être exécuté en tant que commande au niveau utilisateur avec tout programme ou tâche en tête. Expect peut parler à plusieurs programmes en même temps.

Ce que l'expect peut faire

Par exemple, voici quelques opérations que la commande expect peut faire:

  • Faites en sorte que votre ordinateur vous rappelle, de sorte que vous puissiez vous connecter sans payer l'appel.
  • Démarrez une partie et si la configuration optimale n’apparaît pas, relancez-la encore et encore jusqu’à ce qu’elle apparaisse, puis remettez le contrôle à vous.
  • Exécutez fsck et, en réponse à ses questions, répondez "oui" ou "non" ou vous redonner le contrôle en fonction de critères prédéterminés.
  • Connectez-vous à un autre réseau et récupérez automatiquement votre courrier afin qu'il apparaisse comme s'il avait été envoyé à l'origine à votre système local.
  • Transporter des variables d'environnement, un répertoire actuel ou tout type d'informations via rlogin, telnet, tip, su ou chgrp

Le shell ne peut pas effectuer ces tâches pour diverses raisons. Tous sont possibles avec Expect.

En général, Expect est utile pour exécuter tout programme nécessitant une interaction entre le programme et l'utilisateur. Tout ce qui est nécessaire est que l'interaction puisse être caractérisée par programme. Expect peut également redonner le contrôle à l'utilisateur sans interrompre le programme à contrôler. De même, l'utilisateur peut à tout moment reprendre le contrôle du script.

Usage

Expect lit cmdfile pour obtenir une liste des commandes à exécuter. Expect peut être invoqué implicitement sur les systèmes prenant en charge le #! notation en marquant le script comme exécutable et en faisant la première ligne du script:

#! / usr / local / bin / expect -f

Bien sûr, le chemin doit décrire avec précision où habite Expect. / usr / local / bin est juste un exemple.

L'option -c préfigure une commande à exécuter avant toute commande du script. La commande doit être citée pour éviter d'être cassée par le shell. Cette option peut être utilisée plusieurs fois. Plusieurs commandes peuvent être exécutées avec un seul -c en les séparant par des points-virgules. Les commandes sont exécutées dans l'ordre dans lequel elles apparaissent. Lorsque vous utilisez Expectk, cette option est spécifiée sous la forme -command.

L'indicateur -d active certaines sorties de diagnostic, qui signalent principalement l'activité interne des commandes telles que expect et interact. Cet indicateur a le même effet que "exp_internal 1" au début d'un script Expect, plus la version d'Expect est imprimée.

L'indicateur -D active un débogueur interactif. Une valeur entière devrait suivre. Le débogueur prendra le contrôle avant la prochaine procédure Tcl si la valeur est différente de zéro, si un ^ C est enfoncé ou si un point d'arrêt est atteint, ou si une autre commande appropriée du débogueur apparaît dans le script. Lorsque vous utilisez Expectk, cette option est spécifiée comme -Déboguer.

L'indicateur -f est préfacé par un fichier à partir duquel lire les commandes. Le drapeau lui-même est facultatif car il n'est utile que si vous utilisez le #! notation, de sorte que d’autres arguments puissent être fournis sur la ligne de commande. Lorsque vous utilisez Expectk, cette option est spécifiée sous la forme -file.

Par défaut, le fichier de commandes est lu en mémoire et exécuté dans son intégralité. Il est parfois souhaitable de lire les fichiers ligne par ligne. Afin de forcer le traitement de fichiers arbitraires de cette manière, utilisez l'indicateur -b. Lorsque vous utilisez Expectk, cette option est spécifiée en tant que -buffer.

Si la chaîne "-" est fournie en tant que nom de fichier, l'entrée standard est lue à la place. Utilisez "./-" pour lire un fichier nommé "-".

L'option -i amène Expect à demander de manière interactive des commandes au lieu de les lire à partir d'un fichier. L'invite est terminée via la commande exit ou sur EOF. L'indicateur -i est utilisé si aucun fichier de commande ni -c n'est utilisé. Lorsque vous utilisez Expectk, cette option est spécifiée sous la forme -interactive.

- peut être utilisé pour délimiter la fin des options. Ceci est utile si vous souhaitez passer un argument semblable à une option à votre script sans qu'il soit interprété par Expect. Cela peut être utilement placé dans le #! ligne pour empêcher toute interprétation semblable à un drapeau par Expect. Par exemple, ce qui suit laissera les arguments originaux, y compris le nom du script, dans la variable argv .

#! / usr / local / bin / expect -

Notez que les conventions habituelles getopt (3) et execve (2) doivent être observées lors de l'ajout d'arguments au #! ligne.

Le fichier $ exp_library / expect.rc est créé automatiquement s'il est présent, à moins que l'indicateur -N ne soit utilisé. (Lorsque vous utilisez Expectk, cette option est spécifiée sous la forme -NORC.) Immédiatement après, le fichier ~ / .expect.rc est créé automatiquement, sauf si l'option -n est utilisée. Si la variable d'environnement DOTDIR est définie, elle est traitée comme un répertoire et le fichier .expect.rc y est lu. Lorsque vous utilisez Expectk, cette option est spécifiée sous la forme -norc.Ce sourçage ne survient qu'après l'exécution de tous les indicateurs -c.

-v force Expect à imprimer son numéro de version et à quitter. L'indicateur correspondant dans Expectk, qui utilise des noms d'indicateur longs, est -version.

Les arguments facultatifs sont construits dans une liste et stockés dans la variable nommée argv et. argc est initialisé à la longueur de argv.

Argv0 est défini comme étant le nom du script ou le binaire si aucun script n'est utilisé. Par exemple, ce qui suit imprime le nom du script et les trois premiers arguments:

send_user "$ argv0 lrange $ argv 0 2 n"

Les commandes

Expect utilise Tool Command Language. Tcl fournit un flux de contrôle (si, pour, une rupture), une évaluation de l'expression et plusieurs autres fonctionnalités telles que la récurrence et la définition de procédure. Les commandes utilisées ici mais non définies (set, if, exec) sont des commandes Tcl. Expect prend en charge des commandes supplémentaires. Sauf indication contraire, les commandes renvoient la chaîne vide.

Les commandes sont classées par ordre alphabétique pour pouvoir être rapidement localisées. Cependant, il peut être plus facile pour les nouveaux utilisateurs de commencer par lire les descriptions de spawn, send, expect et interact, dans cet ordre.

fermer -slave -onexec 0 | 1 -i spawn_id

ferme la connexion au processus en cours. La plupart des programmes interactifs détecteront EOF sur leur stdin et sortiront; Ainsi Fermer suffit généralement à tuer le processus. L'option -i déclare que le processus à fermer correspond au spawn_id nommé.

Expect et interact détectent à chaque fois que le processus en cours se termine et effectue implicitement une fermeture, mais si vous supprimez le processus en, par exemple, "exec kill $ pid", vous devez appeler explicitement close..

L'indicateur -onexec détermine si l'identifiant de spawn est fermé dans tout nouveau processus spawn ou si le processus est superposé. Pour laisser un identifiant de spawn ouvert, utilisez la valeur 0. Une valeur entière non nulle force la spawn à se fermer dans tout nouveau processus.

Le drapeau -slave ferme l'esclave associé à l'identifiant spawn. Lorsque la connexion est fermée, l'esclave est automatiquement fermé s'il est toujours ouvert.

Que la connexion soit fermée implicitement ou explicitement, vous devez appeler wait pour libérer l'espace de processus du noyau correspondant. La commande de fermeture n'appelle pas wait, car rien ne garantit que la fermeture d'une connexion de processus entraînera sa fermeture.

debug -now 0 | 1

contrôle un débogueur Tcl vous permettant de parcourir des instructions et de définir des points d'arrêt.

Sans arguments, un 1 est renvoyé si le débogueur n'est pas en cours d'exécution, sinon un 0 est renvoyé.

Avec un argument, le débogueur est lancé. Avec un argument 0, le débogueur est arrêté. Si un argument 1 est précédé de l'indicateur -now, le débogueur est démarré immédiatement. Sinon, le débogueur est lancé avec la prochaine instruction Tcl.

La commande debug ne modifie aucune interruption. Comparez ceci au démarrage de Expect avec le drapeau -D.

La commande disconnect déconnecte un processus déclenché du terminal. Il continue à courir en arrière-plan. Le processus reçoit son propre groupe de processus. Les E / S standard sont redirigées vers / dev / null.

Le fragment suivant utilise disconnect pour continuer à exécuter le script en arrière-plan.

si {fork! = 0} quitte déconnecte. . .

Le script suivant lit un mot de passe, puis exécute un programme toutes les heures et demande un mot de passe à chaque exécution. Le script fournit le mot de passe afin que vous n'ayez à le saisir qu'une seule fois.

send_user "password? " expect_user -re "(. *) n" pour {} 1 {} {if {fork! = 0} {sommeil 3600; continuer} déconnecter spawn priv_prog expect Mot de passe: send "$ expect_out ( 1, chaîne) r ". . . sortie }

L'utilisation de la déconnexion sur la fonction de processus asynchrone du shell (&) présente l'avantage de permettre à Expect de sauvegarder les paramètres du terminal avant la déconnexion, puis de les appliquer ultérieurement à de nouveaux ptys. Avec &, Expect n'a pas la possibilité de lire les paramètres du terminal car celui-ci est déjà déconnecté au moment où Expect reçoit le contrôle.

exit -opts status

provoque la sortie ou s’y prépare de toute autre manière.

le -onexit flag fait que l'argument suivant est utilisé comme gestionnaire de sortie. Sans argument, le gestionnaire de sortie actuel est renvoyé.

le -sans issue signaler les causes Attendre pour vous préparer à sortir mais ne restez pas sous le contrôle du système d'exploitation. Le gestionnaire d'exit défini par l'utilisateur est exécuté ainsi que les propres gestionnaires internes d'Expect. Aucune autre commande Expect ne devrait être exécutée. Ceci est utile si vous utilisez Expect avec d'autres extensions Tcl. L'interpréteur actuel (et la fenêtre principale si l'environnement Tk) est conservé afin que les autres extensions Tcl puissent être nettoyées. Si attend sortie est appelé à nouveau (quelle que soit la situation), les gestionnaires ne sont pas réexécutés.

À la sortie, toutes les connexions aux processus générés sont fermées. La fermeture sera détectée comme un EOF par les processus engendrés. sortie n'effectue aucune autre action en dehors de la procédure normale _exit (2). Ainsi, les processus générés qui ne vérifient pas EOF peuvent continuer à s'exécuter. (Diverses conditions sont importantes pour déterminer, par exemple, quels signaux un processus généré sera envoyé, mais elles dépendent du système et sont généralement décrites dans exit (3).) Les processus créés qui continuent à s'exécuter seront hérités par init.

statut (ou 0 si non spécifié) est renvoyé comme statut de sortie de Attendre . sortie est implicitement exécuté si la fin du script est atteinte.

exp_continue -continue_timer

La commande continuer permet attendre lui-même de continuer à exécuter plutôt que de retourner comme d'habitude. Par défaut continuer réinitialise le délai d'attente. le -continue_timer flag empêche le redémarrage de la minuterie. (Voir attendre pour plus d'informations.)

valeur exp_internal -f fichier

provoque l'envoi par d'autres commandes d'informations de diagnostic internes à Attendre à stderr si valeur est non nul. Cette sortie est désactivée si valeur est 0. Les informations de diagnostic incluent chaque caractère reçu et chaque tentative faite pour faire correspondre la sortie actuelle aux modèles.

Si le facultatif fichier est fourni, toutes les sorties normales et de débogage sont écrites dans ce fichier (quelle que soit la valeur de valeur ). Tout fichier de sortie de diagnostic précédent est fermé.

le -Info flag force exp_internal à renvoyer une description des derniers arguments non-info donnés.

exp_open args -i spawn_id

renvoie un identifiant de fichier Tcl qui correspond à l'identifiant de spawn d'origine. L'identifiant de fichier peut alors être utilisé comme s'il était ouvert par Tcl ouvrir commander. (L’identifiant de spawn ne doit plus être utilisé. A attendre ne devrait pas être exécuté.

le -leaveopen flag laisse l'id de spawn ouvert pour l'accès via les commandes Expect. UNE attendre doit être exécuté sur l'identifiant de spawn.

exp_pid -i spawn_id

renvoie l'identifiant du processus correspondant au processus en cours. Si la -je Si le drapeau est utilisé, le pid renvoyé correspond à celui de l'identifiant de spawn donné.

exp_send

est un alias pour envoyer .

exp_send_error

est un alias pour send_error .

exp_send_log

est un alias pour send_log .

exp_send_tty

est un alias pour send_tty .

exp_send_user

est un alias pour send_user .

exp_version -exit version

est utile pour s'assurer que le script est compatible avec la version actuelle d'Expect.

Sans argument, la version actuelle de Attendre est retourné. Cette version peut ensuite être encodée dans votre script. Si vous savez réellement que vous n'utilisez pas les fonctionnalités des versions récentes, vous pouvez spécifier une version antérieure.

Les versions se composent de trois nombres séparés par des points. Le premier est le nombre majeur. Scripts écrits pour les versions de Attendre avec un nombre majeur différent ne fonctionnera presque certainement pas. exp_version renvoie une erreur si les nombres majeurs ne correspondent pas.

La seconde est le numéro mineur. Les scripts écrits pour une version avec un numéro mineur supérieur à la version actuelle peuvent dépendre de certaines nouvelles fonctionnalités et peuvent ne pas s'exécuter. exp_version renvoie une erreur si les numéros majeurs correspondent, mais que le numéro mineur du script est supérieur à celui de l'exécution Attendre .

Troisième est un nombre qui ne joue aucun rôle dans la comparaison de version. Cependant, il est incrémenté lorsque le Attendre la distribution de logiciels est modifiée de quelque manière que ce soit, par exemple par une documentation supplémentaire ou une optimisation. Il est remis à 0 à chaque nouvelle version mineure.

Avec le -sortie drapeau, Attendre imprime une erreur et se ferme si la version est obsolète.

attendez -opts pat1 body1 … -opts patn bodyn

attend que l'un des modèles corresponde à la sortie d'un processus généré, qu'une période spécifiée se soit écoulée ou qu'une fin de fichier soit visible. Si le corps final est vide, il peut être omis.

Patterns du plus récent attendre_avant Les commandes sont implicitement utilisées avant tout autre motif. Patterns du plus récent attendre_après Les commandes sont implicitement utilisées après tout autre motif.

Si les arguments à l'ensemble attendre nécessitant plus d’une ligne, tous les arguments peuvent être "insérés" en une seule afin d’éviter de terminer chaque ligne par une barre oblique inversée. Dans ce cas, les substitutions habituelles de Tcl se produiront malgré les accolades.

Si un motif est le mot clé eof , le corps correspondant est exécuté à la fin du fichier. Si un motif est le mot clé temps libre , le corps correspondant est exécuté à l'expiration du délai. Si aucun mot clé de délai d'expiration n'est utilisé, une action null implicite est exécutée à l'expiration du délai. Le délai d'expiration par défaut est de 10 secondes, mais vous pouvez le définir, par exemple, sur 30 à l'aide de la commande "set timeout 30". Un délai infini peut être désigné par la valeur -1. Si un motif est le mot clé défaut , le corps correspondant est exécuté à l'expiration du délai ou à la fin du fichier.

Si un motif correspond, le corps correspondant est exécuté. attendre renvoie le résultat du corps (ou de la chaîne vide si aucun motif ne correspond). Si plusieurs motifs correspondent, le premier qui apparaît est utilisé pour sélectionner un corps.

Chaque fois qu'une nouvelle sortie arrive, elle est comparée à chaque modèle dans l'ordre indiqué. Ainsi, vous pouvez tester l'absence de correspondance en faisant en sorte que le dernier motif apparaisse comme une invite, par exemple. Dans les cas où il n'y a pas d'invite, vous devez utiliser temps libre (comme vous le feriez si vous interagissiez manuellement).

Les modèles sont spécifiés de trois manières. Par défaut, les modèles sont spécifiés comme avec Tcl match de corde commander. (De tels modèles sont également similaires aux expressions régulières C-shell généralement appelées modèles "glob"). le -gl drapeau peut être utilisé pour protéger des motifs qui pourraient autrement correspondre attendre drapeaux de le faire. Tout motif commençant par "-" doit être protégé de cette façon. (Toutes les chaînes commençant par "-" sont réservées pour les options futures.)

Par exemple, le fragment suivant recherche une connexion réussie. (Notez que avorter est présumée être une procédure définie ailleurs dans le script.)

s'attendre {occupé {met occupé n; exp_continue} échec de l'abandon du "mot de passe invalide" abandon du délai d'attente abandon connecté}

Les citations sont nécessaires sur le quatrième motif car il contient un espace qui séparerait sinon le motif de l'action.Les modèles avec la même action (comme les 3ème et 4ème) nécessitent de lister à nouveau les actions. Cela peut être évité en utilisant des modèles de style regexp (voir ci-dessous). Vous trouverez plus d’informations sur la formation de motifs globaux dans le manuel Tcl.

Les modèles de style Regexp suivent la syntaxe définie par Tcl expression rationnelle (abréviation de "expression régulière"). les modèles d'expression rationnelle sont introduits avec le drapeau -ré . L'exemple précédent peut être réécrit en utilisant une expression rationnelle ainsi:

s'attendre {occupé {met occupé n; exp_continue} -re "échec | mot de passe invalide" abort timeout abort connected}

Les deux types de motifs sont "non ancrés". Cela signifie que les modèles ne doivent pas nécessairement correspondre à la chaîne entière, mais peuvent commencer et terminer la correspondance n'importe où dans la chaîne (tant que tout le reste est identique). Utilisez ^ pour faire correspondre le début d'une chaîne et $ pour faire correspondre la fin. Notez que si vous n'attendez pas la fin d'une chaîne, vos réponses peuvent facilement se retrouver au milieu de la chaîne car elles sont répercutées du processus généré. Tout en produisant des résultats corrects, le résultat peut paraître anormal. Ainsi, l'utilisation de $ est encouragée si vous pouvez décrire exactement les caractères à la fin d'une chaîne.

Notez que dans de nombreux éditeurs, ^ et $ correspondent respectivement au début et à la fin des lignes. Toutefois, comme attendu n’est pas orienté ligne, ces caractères correspondent au début et à la fin des données (par opposition aux lignes) actuellement dans le tampon de correspondance attendu. (Voir également la note ci-dessous sur "Indigestion du système".)

le -ex flag fait correspondre le motif à une chaîne "exacte". Aucune interprétation de *, ^, etc. n’est faite (bien que les conventions habituelles de Tcl doivent toujours être observées). Les modèles exacts sont toujours sans ancrage.

le -aucun cas flag permet de comparer les caractères majuscules de la sortie comme s'il s'agissait de caractères minuscules. Le motif n'est pas affecté.

Lors de la lecture de la sortie, plus de 2000 octets peuvent forcer les octets antérieurs à être "oubliés". Ceci peut être changé avec la fonction match_max . (Notez que des valeurs trop grandes peuvent ralentir l’appariement de motifs.) Si patlist est full_buffer , le corps correspondant est exécuté si match_max octets ont été reçus et aucun autre modèle ne correspond. Que ce soit ou non le full_buffer Si le mot-clé est utilisé, les caractères oubliés sont écrits dans expect_out (tampon).

Si patlist est le mot clé nul , et les valeurs nulles sont autorisées (via la remove_nulls commande), le corps correspondant est exécuté si un seul ASCII 0 est mis en correspondance. Il n'est pas possible de faire correspondre 0 octet via des modèles glob ou regexp.

Lors de la mise en correspondance d'un motif (ou de eof ou de full_buffer), toute sortie correspondante et précédemment non appariée est enregistrée dans la variable expect_out (tampon) . Jusqu'à 9 correspondances de sous-chaînes d'expressions rationnelles sont enregistrées dans les variables expect_out (1, chaîne) à travers expect_out (9, chaîne) . Si la -indices drapeau est utilisé avant un motif, les indices de début et de fin (sous une forme adaptée à lange ) des 10 chaînes sont stockées dans les variables expect_out (X, début) et expect_out (X, fin) où X est un chiffre, correspond à la position de la sous-chaîne dans la mémoire tampon. 0 fait référence aux chaînes qui correspondent au modèle entier et sont générées pour les modèles globaux ainsi que pour les modèles d'expression régulière. Par exemple, si un processus a généré "abcdefgh n", le résultat de:

attendre "cd"

est comme si les déclarations suivantes avaient été exécutées:

set expect_out (0, string) cd set expect_out (tampon) abcd

et "efgh n" est laissé dans le tampon de sortie. Si un processus a généré le résultat "abbbcabkkkka n", le résultat de:

attendez -indices -re "b (b *). * (k +)"

est comme si les déclarations suivantes avaient été exécutées:

set expect_out (0, début) 1 set expect_out (0, fin) 10 set expect_out (0, chaîne) bbbcabkkkk set expect_out (1, début) 2 set expect_out (1, fin) 3 set expect_out (1, chaîne) bb set expect_out (2, début) 10 set expect_out (2, fin) 10 set expect_out (2, chaîne) k set expect_out (tampon) abbbcabkkkk

et "a n" est laissé dans le tampon de sortie. Le modèle "*" (et -re ". *") Videra le tampon de sortie sans lire plus de sortie du processus.

Normalement, la sortie correspondante est supprimée des mémoires tampons internes d'Expect. Cela peut être évité en préfixant un motif avec le -notransfert drapeau. Cet indicateur est particulièrement utile pour les expérimentations (et peut être abrégé en "-not" pour plus de commodité lors des expérimentations).

L'identifiant de spawn associé à la sortie correspondante (ou eof ou full_buffer) est stocké dans expect_out (spawn_id) .

le -temps libre Si l'indicateur est utilisé, la commande current attend la valeur suivante comme délai d'attente au lieu d'utiliser la valeur de la variable de délai d'attente.

Par défaut, les modèles sont comparés à la sortie du processus en cours, mais le -je flag déclare que la sortie de la liste spawn_id nommée doit être comparée à tous les modèles suivants (jusqu'au prochain -je ). La liste spawn_id doit être une liste spawn_ids séparée par des espaces ou une variable faisant référence à une telle liste spawn_ids.

Par exemple, l'exemple suivant attend "connecté" à partir du processus en cours, ou "occupé", "en échec" ou "mot de passe invalide" à partir du spawn_id nommé par $ proc2.

attend {-i $ proc2 occupé {met occupé n; exp_continue} -re "échec | mot de passe invalide" abort timeout abort connected}

La valeur de la variable globale any_spawn_id peut être utilisé pour apparier des modèles à n'importe quel spawn_ids qui est nommé avec tous les autres -je drapeaux dans le courant attendre commander. Le spawn_id d'un -je drapeau sans motif associé (c'est-à-dire, suivi immédiatement d'un autre -je ) est mis à la disposition de tout autre motif de la même attendre commande associée à any_spawn_id.

le -je flag peut également nommer une variable globale, auquel cas la variable est lue pour une liste d'identifiants de spawn. La variable est relue à chaque changement. Cela fournit un moyen de changer la source d'E / S pendant l'exécution de la commande. Les identifiants d'apparition fournis de cette manière sont appelés des identifiants d'apparition "indirects".

Des actions telles que Pause et continuer provoquer des structures de contrôle (c.-à-d., pour , proc ) se comporter de la manière habituelle. La commande continuer permet attendre lui-même de continuer à exécuter plutôt que de retourner comme d'habitude.

Ceci est utile pour éviter les boucles explicites ou les déclarations attendues répétées. L'exemple suivant fait partie d'un fragment permettant d'automatiser rlogin. le continuer évite d'avoir à écrire une seconde attendre instruction (pour rechercher à nouveau l'invite) si rlogin demande un mot de passe.

expect {Mot de passe: {stty -echo send_user "mot de passe (pour $ user) sur $ host:" expect_user -re "(. *) n" send_user " n" send "$ expect_out (1, chaîne) r" stty echo exp_continue} incorrect {send_user "mot de passe ou compte invalide n" exit} délai d'attente {send_user "connexion à $ hôte expirée n" sortie} eof {send_user "connexion a échoué: $ expect_out (tampon)" sortie} - re $ invite}

Par exemple, le fragment suivant peut aider un utilisateur à guider une interaction déjà totalement automatisée. Dans ce cas, le terminal est mis en mode brut. Si l'utilisateur appuie sur "+", une variable est incrémentée. Si vous appuyez sur "p", plusieurs retours sont envoyés au processus, par exemple pour le piquer, et "i" permet à l'utilisateur d'interagir avec le processus, ce qui lui permet de prendre le contrôle du script. Dans chaque cas, le continuer permet le courant attendre pour continuer la correspondance de modèle après l'exécution de l'action en cours.

stty raw -echo expect_after {-i $ user_spawn_id "p" {send " r r r"; exp_continue} "+" {incr toto; exp_continue} "i" {interact; exp_continue} "quit" exit}

Par défaut, continuer réinitialise le délai d'attente. La minuterie n'est pas redémarrée si continuer est appelé avec le -continue_timer drapeau.

expect_after expect_args

fonctionne de manière identique à la attendre_avant sauf que si les motifs des deux attendre et attendre_après peut correspondre, le attendre le motif est utilisé. Voir le attendre_avant commande pour plus d'informations.

expect_background expect_args

prend les mêmes arguments queattendre Cependant, il revient immédiatement. Les motifs sont testés à chaque nouvelle entrée. Le motiftemps libre etdéfaut sont sans signification pourexpect_background et sont jetés silencieusement. Sinon, leexpect_background commande utiliseattendre_avant etattendre_après des motifs commeattendre Est-ce que.

Quandexpect_background les actions sont en cours d'évaluation, le traitement en arrière-plan pour le même identifiant d'apparition est bloqué. Le traitement en arrière-plan est débloqué à la fin de l'action. Lorsque le traitement en arrière-plan est bloqué, il est possible de faire un (premier plan)attendre sur le même identifiant de spawn.

Il n’est pas possible d’exécuter unattendre alors qu'unexpect_background est débloqué.expect_background pour un identifiant de spawn particulier est supprimé en déclarant un nouveau expect_background avec le même id de spawn. Déclarerexpect_background sans motif supprime l'id de spawn donné de la possibilité de faire correspondre les motifs en arrière-plan.

expect_before expect_args

prend les mêmes arguments queattendre Cependant, il revient immédiatement. Pattern-action pairs du plus récentattendre_avant avec le même identifiant de spawn sont implicitement ajoutés à tout ce qui suitattendre commandes. Si un motif correspond, il est traité comme s'il avait été spécifié dansattendre la commande elle-même et le corps associé est exécuté dans le contexte de laattendre commander. Si les motifs des deuxattendre_avant etattendre peut correspondre, leattendre_avant le motif est utilisé.

Si aucun motif n'est spécifié, l'ID de spawn n'est vérifié pour aucun motif.

Sauf si remplacé par un-je drapeau,attendre_avant les motifs correspondent à l'identifiant de spawn défini au moment où leattendre_avant La commande a été exécutée (pas quand son motif correspond).

Le drapeau -info provoqueattendre_avant renvoyer les spécifications actuelles de quels modèles il correspondra. Par défaut, il rend compte de l'identifiant d'apparition actuel. Une spécification facultative d'identifiant spawn peut être donnée pour plus d'informations sur cet identifiant spawn. Par exemple

expect_before -info -i $ proc

Au plus une spécification d'identifiant de spawn peut être donnée. Flag -indirect supprime les identifiants d'apparition directe provenant uniquement de spécifications indirectes.

Au lieu d'une spécification d'ID de spawn, l'indicateur "-all" fera en sorte que "-info" génère un rapport sur tous les id d'apparition.

La sortie de l'indicateur -info peut être réutilisée en tant qu'argument de expect_before.

expect_tty expect_args

est commeattendre mais il lit les caractères de / dev / tty (c'est-à-dire des frappes de touche de l'utilisateur). Par défaut, la lecture est effectuée en mode cuit. Ainsi, les lignes doivent se terminer par un retour pour queattendre de les voir. Ceci peut être changé viastty (voir lestty commande ci-dessous).

expect_user expect_args

est commeattendre mais il lit les caractères de stdin (c'est-à-dire les frappes de touche de l'utilisateur). Par défaut, la lecture est effectuée en mode cuit. Ainsi, les lignes doivent se terminer par un retour pour queattendre de les voir.Ceci peut être changé viastty (voir lestty commande ci-dessous).

fourchette

crée un nouveau processus. Le nouveau processus est une copie exacte du logiciel actuel.Attendre processus. En cas de succès,fourchette renvoie 0 au nouveau processus (enfant) et renvoie l'ID de processus du processus enfant au processus parent. En cas d'échec (invariablement par manque de ressources, par exemple, espace d'échange, mémoire),fourchette renvoie -1 au processus parent et aucun processus enfant n'est créé.

Les processus forkés sortent via lesortie commande, tout comme le processus d'origine. Les processus forkés sont autorisés à écrire dans les fichiers journaux. Si vous ne désactivez pas le débogage ou la journalisation dans la plupart des processus, le résultat peut être déroutant.

Certaines implémentations pty peuvent être confondues par plusieurs lecteurs et écrivains, même momentanément. Ainsi, il est plus sûr defourchette avant les processus de frai.

interagir string1 body1 … stringn bodyn

donne le contrôle du processus en cours à l'utilisateur, de sorte que les frappes de touche soient envoyées au processus en cours, et que les commandes stdout et stderr du processus en cours soient renvoyées.

Les paires chaîne-corps peuvent être spécifiées en tant qu'arguments, auquel cas le corps est exécuté lors de la saisie de la chaîne correspondante. (Par défaut, la chaîne n'est pas envoyée au processus en cours.)interprète la commande est supposée si le corps final est manquant.

Si les arguments à l'ensembleinteragir nécessitant plus d’une ligne, tous les arguments peuvent être "insérés" en une seule afin d’éviter de terminer chaque ligne par une barre oblique inversée. Dans ce cas, les substitutions habituelles de Tcl se produiront malgré les accolades.

Par exemple, la commande suivante exécute une interaction avec les paires chaîne-corps suivantes définies: Lorsque vous appuyez sur ^ Z,Attendre est suspendue. (Le-réinitialiser flag restaure les modes du terminal.) Lorsque vous appuyez sur ^ A, l’utilisateur voit "vous avez tapé un contrôle-A" et le processus reçoit un ^ A. Lorsque l'utilisateur appuie sur $, l'utilisateur voit la date. Lorsque ^ C est enfoncé,Attendre sorties. Si "foo" est entré, l'utilisateur voit "bar". Lorsque vous appuyez sur ~~, leAttendre l'interprète s'exécute de manière interactive.

set CTRLZ 032 interact {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "vous avez tapé un contrôle-A n"; send " 001"} $ {send_user "La date est format de l’horloge secondes de l’horloge."} 003 exit foo {send_user "bar"} ~~}

Dans les paires chaîne-corps, les chaînes sont appariées dans l'ordre dans lequel elles sont répertoriées en tant qu'arguments. Les chaînes qui correspondent partiellement ne sont pas envoyées au processus en cours en prévision du reste. Si les caractères sont ensuite entrés de telle sorte qu'il ne peut plus y avoir de correspondance, seule la partie de la chaîne est envoyée au processus qui ne peut éventuellement pas commencer une autre correspondance. Ainsi, les chaînes qui sont des sous-chaînes de correspondances partielles peuvent correspondre ultérieurement, si les chaînes d'origine qui tentaient de correspondre correspondent finalement.

Par défaut, la correspondance des chaînes est exacte, sans caractère générique. (En revanche, leattendre Cette commande utilise par défaut des modèles glob-style.-ex drapeau peut être utilisé pour protéger des modèles qui pourraient autrement correspondreinteragir drapeaux de le faire. Tout motif commençant par "-" doit être protégé de cette façon. (Toutes les chaînes commençant par "-" sont réservées pour les options futures.)

le-ré flag force la chaîne à être interprétée comme un motif de style regexp. Dans ce cas, les sous-chaînes correspondantes sont stockées dans la variable interact_out de la même manière que le cheminattendre stocke sa sortie dans la variableexpect_out . le-indices flag est pris en charge de manière similaire.

Le motifeof introduit une action qui est exécutée à la fin du fichier. Un séparéeof motif peut également suivre la-sortie Dans ce cas, il est mis en correspondance si un eof est détecté lors de l'écriture de la sortie. Le défauteof l'action est "retour", de sorte queinteragir revient simplement sur n'importe quel EOF.

Le motiftemps libre introduit un délai d'attente (en secondes) et une action exécutée après qu'aucun caractère n'ait été lu pendant un temps donné. letemps libre motif s'applique au dernier processus spécifié. Il n'y a pas de délai d'attente par défaut. La variable spéciale "timeout" (utilisée par leattendre commande) n’a aucun effet sur ce délai.

Par exemple, l'instruction suivante peut être utilisée pour déconnecter automatiquement les utilisateurs qui n'ont rien saisi depuis une heure mais qui reçoivent toujours des messages système fréquents:

interact -input $ user_spawn_id timeout 3600 return -output $ spawn_id

Si le motif est le mot clénul , et les valeurs nulles sont autorisées (via laremove_nulls commande), le corps correspondant est exécuté si un seul ASCII 0 est mis en correspondance. Il n'est pas possible de faire correspondre 0 octet via des modèles glob ou regexp.

Préfacer un motif avec le drapeau-j'écris provoque la variable interact_out (spawn_id) à définir sur spawn_id qui correspond au modèle (ou eof).

Des actions telles quePause etcontinuer provoquer des structures de contrôle (c.-à-d.,pour , proc ) se comporter de la manière habituelle. toutefoisrevenir provoque l'interaction pour retourner à son appelant, tandis queinter_return causesinteragir provoquer un retour dans son appelant. Par exemple, si "proc foo" appeléinteragir qui a ensuite exécuté l'actioninter_return , proc foo retournerais. (Cela signifie que siinteragir appelsinterprète taper de manière interactiverevenir fera en sorte que l'interaction se poursuive,inter_return l’interaction retournera à son appelant.)

Pendantinteragir , le mode brut est utilisé pour que tous les caractères puissent être passés au processus en cours.Si le processus en cours n'intercepte pas les signaux de contrôle des travaux, il s'arrêtera si un signal d'arrêt est envoyé (par défaut, ^ Z). Pour le redémarrer, envoyez un signal de poursuite (comme par exemple "kill -CONT"). Si vous voulez vraiment envoyer un SIGSTOP à un tel processus (par ^ Z), envisagez d'abord de générer csh, puis d'exécuter votre programme. Par contre, si vous voulez envoyer un SIGSTOP àAttendre appelez d'abord l'interprète (peut-être en utilisant un caractère d'échappement), puis appuyez sur ^ Z.

Les paires chaîne-corps peuvent être utilisées comme un raccourci pour éviter d'avoir à entrer dans l'interpréteur et à exécuter des commandes de manière interactive. Le mode terminal précédent est utilisé pendant l'exécution du corps d'une paire chaîne-corps.

Pour la vitesse, les actions sont exécutées en mode brut par défaut. le-réinitialiser drapeau réinitialise le terminal sur le mode qu'il avait avantinteragir a été exécuté (invariablement, mode cuit). Notez que les caractères saisis lors du changement de mode peuvent être perdus (une caractéristique regrettable du pilote de terminal sur certains systèmes). La seule raison d'utiliser-réinitialiser est si votre action dépend de l'exécution en mode cuit.

le-écho flag envoie les caractères correspondant au modèle suivant au processus qui les a générés à la lecture de chaque caractère. Cela peut être utile lorsque l'utilisateur a besoin de voir les retours de modèles partiellement typés.

Si un motif est répété mais ne correspond finalement pas, les caractères sont envoyés au processus engendré. Si le processus généré les renvoie, l'utilisateur verra les caractères deux fois.-écho n’est probablement approprié que dans des situations où il est peu probable que l’utilisateur ne complète pas le motif. Par exemple, l'extrait suivant provient de rftp, le script récursif-ftp, dans lequel l'utilisateur est invité à entrer ~ g, ~ p ou ~ l, pour obtenir, mettre ou répertorier le répertoire actuel de manière récursive. Celles-ci sont si éloignées des commandes ftp normales, qu'il est peu probable que l'utilisateur tape ~ suivi de quoi que ce soit d'autre, sauf par erreur, auquel cas, ils ignoreront probablement le résultat de toute façon.

interact {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

le-nobuffeur flag envoie les caractères correspondant au modèle suivant dans le processus de sortie au fur et à mesure que les caractères sont lus.

Ceci est utile lorsque vous souhaitez qu'un programme répète le motif. Par exemple, les éléments suivants peuvent être utilisés pour surveiller le lieu où une personne compose le numéro (modem de type Hayes). Chaque fois que "atd" est vu, le script enregistre le reste de la ligne.

proc lognumber {} {interact -nobuffer -re "(. *) r" return met $ log "format d'horloge secondes d'horloge: numéroté $ interact_out (1, chaîne)"} interact -nobuffer "atd" lognumber

Pendantinteragir , utilisation antérieure deutilisateur_journal est ignoré. En particulier,interagir forcera sa sortie à être enregistrée (envoyée à la sortie standard) car il est présumé que l'utilisateur ne souhaite pas interagir de manière aveugle.

le-o flag permet d’appliquer toutes les paires clé-corps suivantes à la sortie du processus en cours. Cela peut être utile, par exemple, lorsque vous traitez avec des hôtes qui envoient des caractères indésirables pendant une session telnet.

Par défaut,interagir s'attend à ce que l'utilisateur écrive stdin et lise stdout duAttendre processus lui-même. le-u flag (pour "utilisateur") faitinteragir cherche l'utilisateur en tant que processus nommé par son argument (qui doit être un identifiant spawn).

Cela permet de joindre deux processus non liés sans utiliser de boucle explicite. Pour faciliter le débogage, les diagnostics Expect vont toujours à stderr (ou stdout pour certaines informations de journalisation et de débogage). Pour la même raison, leinterprète La commande lira interactivement à partir de stdin.

Par exemple, le fragment suivant crée un processus de connexion. Ensuite, il compose le numéro de l’utilisateur (non représenté) et relie enfin les deux. Bien entendu, tout processus peut être substitué à la connexion. Un shell, par exemple, permettrait à l'utilisateur de travailler sans fournir de compte ni de mot de passe.

spawn login set login $ spawn_id spawn tip modem # appelez l'utilisateur # connectez-vous pour vous connecter interact -u $ login

Pour envoyer la sortie à plusieurs processus, répertoriez chaque liste d'identifiant spawn précédée d'un-sortie drapeau. L'entrée pour un groupe d'identifiants de spawn en sortie peut être déterminée par une liste d'identifiants de spawn précédée d'un-contribution drapeau. (Tous les deux-contribution et-sortie peut prendre des listes dans la même forme que la-je drapeau dans leattendre commande, sauf que any_spawn_id n’a pas de sens dansinteragir .) Tous les indicateurs et chaînes (ou modèles) suivants s’appliquent à cette entrée jusqu’à ce qu’un autre indicateur -input apparaisse. Sinon-contribution apparaît,-sortie implique "-input $ user_spawn_id -output". (De même, avec des motifs qui n’ont pas-contribution .) Si un-contribution est spécifié, il remplace $ user_spawn_id. Si une seconde-contribution est spécifié, il remplace $ spawn_id. Additionnel-contribution les drapeaux peuvent être spécifiés.

Par défaut, les deux processus d'entrée implicites ont leurs sorties spécifiées comme suit: $ spawn_id et $ user_spawn_id (en sens inverse). Si un-contribution le drapeau apparaît sans-sortie drapeau, les caractères de ce processus sont ignorés.

le-je flag introduit un remplacement pour le spawn_id actuel quand aucun autre-contribution ou-sortie les drapeaux sont utilisés. Un drapeau -i implique un drapeau -o.

Il est possible de changer les processus avec lesquels on interagit en utilisant des identifiants de spawn indirects. (Les identifiants d'apparition indirectes sont décrits dans la section sur la commande expect.) Les identifiants d'apparition indirectes peuvent être spécifiés avec les indicateurs -i, -u, -input ou -output.

interprète args

provoque une invite interactive de l'utilisateurAttendre et commandes Tcl. Le résultat de chaque commande est imprimé.

Des actions telles quePause etcontinuer provoquer des structures de contrôle (c.-à-d.,pour , proc ) se comporter de la manière habituelle. toutefoisrevenir oblige l'interprète à retourner à l'appelant, tandis queinter_return causesinterprète provoquer un retour dans son appelant. Par exemple, si "proc foo" appeléinterprète qui a ensuite exécuté l'actioninter_return , proc foo retournerais. Toute autre commande causeinterprète pour continuer à demander de nouvelles commandes.

Par défaut, l'invite contient deux entiers. Le premier nombre entier décrit la profondeur de la pile d’évaluation (c’est-à-dire combien de fois Tcl_Eval a été appelé). Le second entier est l'identifiant de l'historique Tcl. L'invite peut être définie en définissant une procédure appelée "invite1" dont la valeur de retour devient l'invite suivante. Si une instruction a des guillemets, des parenthèses, des accolades ou des crochets ouverts, une invite secondaire (par défaut "+>") est émise à la nouvelle ligne. L'invite secondaire peut être définie en définissant une procédure appelée "invite2".

Pendantinterprète , le mode cuit est utilisé, même si l'appelant utilisait le mode brut.

Si stdin est fermé,interprète reviendra à moins que le-de flag est utilisé, auquel cas l'argument suivant est appelé.

log_file args -a fichier

Si un nom de fichier est fourni,fichier journal enregistrera une transcription de la session (commençant à ce moment-là) dans le fichier.fichier journal arrêtera l'enregistrement si aucun argument n'est donné. Tout fichier journal précédent est fermé.

Au lieu d’un nom de fichier, un identifiant de fichier Tcl peut être fourni en utilisant-ouvrir ou-leaveopen drapeaux. Ceci est similaire à lafrayer commander. (Voirfrayer pour plus d'informations.)

le-une drapeau force la sortie à enregistrer qui a été supprimée par leutilisateur_journal commander.

Par défaut, lefichier journal commander ajoute aux anciens fichiers plutôt que de les tronquer, pour la commodité de pouvoir activer et désactiver la connexion plusieurs fois au cours d'une même session. Pour tronquer des fichiers, utilisez le-noappend drapeau.

le-Info flag permet à log_file de renvoyer une description des arguments non-info les plus récents.

utilisateur_journal -info | 0 | 1

Par défaut, le dialogue d'envoi / attente est enregistré sur stdout (et un fichier journal s'il est ouvert). La journalisation sur stdout est désactivée par la commande "log_user 0" et réactivée par "log_user 1". L'enregistrement dans le fichier journal est inchangé.

le-Info La commande flag_user renvoie une description des arguments non-info les plus récents.

match_max -d -i spawn_id taille

définit la taille de la mémoire tampon (en octets) utilisée en interne parattendre . Sans Taille argument, la taille actuelle est retournée.

Avec le-ré drapeau, la taille par défaut est définie. (La valeur par défaut est 2000.) Avec le-je flag, la taille est définie pour l'identifiant spawn nommé, sinon, elle est définie pour le processus en cours.

superposition - # spawn_id - # spawn_id … programme args

exécute "programme args "à la place du courantAttendre programme, qui se termine. Un argument trait d'union simple oblige un trait d'union devant le nom de la commande comme s'il s'agissait d'un shell de connexion. Tous les spawn_ids sont fermés à l'exception de ceux nommés en tant qu'arguments. Ceux-ci sont mappés sur les identificateurs de fichier nommés.

Les spawn_ids sont mappés aux identificateurs de fichier que le nouveau programme doit hériter. Par exemple, la ligne suivante exécute les échecs et permet de la contrôler par le processus en cours, par exemple un maître d’échecs.

superposition -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id aux échecs

C’est plus efficace que "interact -u", cependant, cela sacrifie la possibilité d’interaction programmée car laAttendre le processus n'est plus sous contrôle.

Notez qu'aucun terminal de contrôle n'est fourni. Ainsi, si vous déconnectez ou remappez l'entrée standard, les programmes qui contrôlent le travail (shells, login, etc.) ne fonctionneront pas correctement.

parité -d -i spawn_id valeur

définit si la parité doit être conservée ou supprimée de la sortie des processus générés. Si valeur est égal à zéro, la parité est supprimée, sinon elle ne l'est pas. Sans valeur argument, la valeur actuelle est renvoyée.

Avec le-ré drapeau, la valeur de parité par défaut est définie. (La valeur par défaut est 1, c’est-à-dire que la parité n’est pas supprimée.)-je flag, la valeur de parité est définie pour l'identifiant spawn nommé, sinon elle est définie pour le processus en cours.

remove_nulls -d -i spawn_id valeur

définit si les valeurs NULL sont conservées ou supprimées de la sortie des processus générés avant la mise en correspondance des modèles ou leur stockage dans la variable expect_out ou interact_out . Si valeur est égal à 1, les valeurs NULL sont supprimées. Si valeur est 0, les valeurs NULL ne sont pas supprimées. Sans valeur argument, la valeur actuelle est renvoyée.

Avec le-ré drapeau, la valeur par défaut est définie. (La valeur par défaut est 1, c’est-à-dire que les valeurs NULL sont supprimées.)-je flag, la valeur est définie pour l’identifiant spawn nommé, sinon il est défini pour le processus en cours.

Que les valeurs nulles soient supprimées ou non,Attendre enregistrera des octets nuls dans le journal et stdout.

send -flags string

Envoie chaîne au processus actuel. Par exemple, la commande

envoyer "bonjour le monde r"

envoie les caractères au processus en cours. (Tcl inclut une commande semblable à printf (appeléeformat ) qui peut construire des chaînes arbitrairement complexes.)

Les caractères sont envoyés immédiatement, bien que les programmes avec une entrée avec tampon de ligne ne lisent pas les caractères tant qu'un caractère de retour n'est pas envoyé. Un caractère de retour est noté " r".

le-- flag force le prochain argument à être interprété comme une chaîne plutôt que comme un drapeau.Toute chaîne peut être précédée de "-", qu'elle ressemble ou non à un drapeau. Ceci fournit un mécanisme fiable pour spécifier des chaînes de variables sans être déclenché par celles qui ressemblent accidentellement à des drapeaux. (Toutes les chaînes commençant par "-" sont réservées pour les options futures.)

le-je flag déclare que la chaîne est envoyée au spawn_id nommé. Si le spawn_id est user_spawn_id et que le terminal