2010-01-16 10 views
3

Je suis à mi-chemin de l'écriture d'un script Expect sur un serveur Linux qui est supposé se connecter à telnet à un routeur pour collecter des informations système. Jusqu'à présent, mon script peut réussir la connexion, exécuter une commande de routeur, se déconnecter et se terminer.Comment enregistrer et analyser une sortie de commande dans Expect?

La commande affiche quelques lignes que j'ai besoin d'analyser, quelque chose que je ne suis pas sûr de savoir dans Expect. Comment puis-je enregistrer la sortie, grep une ligne, puis une colonne de la ligne, et enfin enregistrer le résultat dans un fichier? Si possible, je voudrais utiliser Expect entièrement plutôt qu'une solution de contournement (par exemple Expect embdded in Bash).

Merci pour votre temps. jk04

+0

pouvez-vous nous montrer quelques exemples de sortie? –

+0

http://meta.stackexchange.com/questions/4481/apply-markup-code-in-comments –

Répondre

6

fondamentalement, $ expect_out (tampon) [1]. maintient la sortie de la dernière correspondance à celle en cours. vous pouvez trouver votre sortie de commande là.

et pour la manipulation de chaînes, vous pouvez simplement utiliser les fonctions intégrées de tcl [2] [3].

  1. "Comment accéder au résultat d'une commande à distance en expect" http://wiki.tcl.tk/2958
  2. "regexp" http://wiki.tcl.tk/986
  3. "string match" http://wiki.tcl.tk/4385
+0

Je pense que $ expect_out (buffer) contient seulement le texte correspondant à votre modèle, pas tout le texte du dernier attend correspondre à la l'actuel. –

+0

Je pense que non, vous pouvez vérifier la discussion sur "expect_out (tampon) a le contenu de l'envoi précédent", http://wiki.tcl.tk/17378 –

+0

devrais-je dire oui? puisque le texte correspondant au motif courant est la sortie du dernier attendu à l'actuel :) –

6

Deux conseils pour attendre le développement:

  • autoexpect pour mettre en place un cadre pour votre automatisation
  • exp_internal 1 pour montrer verbalement ce que l'on s'attend à faire en interne. Celui-ci est indispensable quand vous ne pouvez pas comprendre pourquoi votre expression régulière ne capture pas ce que vous attendez.
+1

** exp_internal 1 ** aversome! – gavenkoa

3

J'ai rencontré et résolu un problème similaire pour interagir avec bash. Je crois que l'approche se généralise à tout autre environnement interactif qui fournit une sortie non-op, à chaîne fixe.

Fondamentalement, j'enveloppe la commande avec deux chaînes fixes, puis recherche le modèle qui inclut ces chaînes au début et à la fin, et enregistre le contenu entre eux. Par exemple:

set var ""; 
expect $prompt { send "echo PSTART; $command; echo PEND;\r"; } 
expect { 
    -re PSTART\r\n(.*)PEND\r\n$prompt { set var [ string trim $expect_out(1,string) ]; send "\r"; } 
    -re $prompt { set var "" ; send "\r"; } 
    timeout { send_user "TIMEOUT\n"; exit } 
} 

Je pense que cette approche travaillerait avec les personnages de commentaires d'une coquille aussi bien, ou une commande d'état simple qui renvoie une sortie connue.

Ensuite, vous pouvez faire tout ce dont vous avez besoin avec le contenu de 'var'.