2009-09-24 4 views
7

J'ai hérité d'une application interactive Unix en ligne de commande, qui n'est plus supportée par son éditeur depuis 20 ans. Nous devons automatiser certaines tâches dans cette application.Comment puis-je contrôler une application Unix interactive par programmation via Perl?

Le plus gênant de ceux-ci consiste à créer des milliers de nouveaux enregistrements avec des paramètres légèrement différents (par exemple, des identifiants différents, des noms différents). Les enregistrements doivent être créés en séquence, un à la fois, ce qui prendrait plusieurs mois (et donc des dollars) à faire manuellement. Dans la plupart des cas, la création d'un enregistrement a un modèle très prévisible de saisie des commandes, de lecture des réponses, de saisie de commandes supplémentaires, etc. Cependant, certaines opérations de création d'enregistrements entraînent des conditions d'erreur (enregistrement avec cet identifiant). un ensemble différent de commandes à quitter gracieusement.

je peux voir quelques différentes façons de le faire:

  • pipes nommés. Ecrivez un script Perl qui exécute l'application cible avec STDIN et STDOUT définis sur des canaux nommés puis envoie à l'application cible la séquence de commandes pour créer un enregistrement avec les paramètres requis, puis demande à l'application cible de quitter et de fermer. Nous exécutons ensuite le script autant de fois que nécessaire avec différents paramètres.

  • Application. Trouver un autre outil Unix qui peut être utilisé pour scripter des programmes interactifs. Les seuls que j'ai pu trouver sont expect, mais cela ne semble pas être le mieux maintenu; et le chat, dont je me souviens d'il y a très longtemps, et qui semble faire plus ou moins ce que je veux, mais semble être seulement pour contrôler les modems.

Encore une complication potentielle: Je pense que l'application cible a été écrit pour un terminal VT100 et il utilise une sorte de séquences d'échappement pour faire des choses comme fournir souligner.

Ma question est quelle approche dois-je prendre? L'un d'entre eux, ou quelque chose de complètement différent? J'aime bien l'idée d'utiliser des tubes nommés, puis d'avoir un script Perl qui ouvre les FIFO et lit et écrit selon les besoins, car il offre beaucoup de flexibilité, mais d'après ce que j'ai lu, il semble qu'il y ait beaucoup de problèmes potentiels Je descends ce chemin.

Merci d'avance.

+1

s'attendre est maintenant sur sourceforge http://sourceforge.net/projects/expect/ – Mark

+0

Mise à jour: J'ai l'étoffe d'une solution en utilisant Expect.pm. Merci à tous ceux qui ont répondu. Je peux SSH sur le serveur de test, démarrer l'application et commencer à interagir avec elle. On dirait que les codes de contrôle VT100 sont assez simples. Actuellement, je n'ai pas de compte, mais j'ai appris quelques noms d'utilisateur, donc je pense que mon premier vrai test d'automatisation sera une attaque de dictionnaire sur le compte du démonstrateur ... –

Répondre

12

Je choisirais définitivement Perl pour la flexibilité supplémentaire, comme le suggère le chaos. Connaissez-vous le Expect perl module? C'est beaucoup plus agréable que l'approche du tuyau nommé. Notez également qu'avec les canaux nommés, vous ne pouvez pas forcer la sortie de votre ancienne application à être sans tampon, ce qui peut être gênant. Je pense Expect.pm utilise pseudo-ttys pour contourner ce problème, mais je ne suis pas sûr. Voir la discussion au perlipc dans la section "Bidirectional Communication with Another Process" pour plus de détails.

+0

Je n'étais pas au courant du module Expect Perl, donc je lui donne un tourbillon. Cela semble prometteur jusqu'à présent, la documentation est un peu légère - j'ai probablement besoin de lire sur l'original. –

4

expect est beaucoup plus solide que vous ne le croyez probablement, mais si j'étais vous j'irais toujours avec l'option Perl, voulant avoir un langage de programmation complet et familier pour gérer le processus et avoir confiance que, quels que soient les problèmes étranges, il y aura des façons de les résoudre.

4

Attendez-vous, soit avec le Tcl ou Perl implementation s, serait ma première tentative. Si vous voyez des séquences impaires dans la sortie parce qu'il fait des choses bizarres, il suffit de filtrer celles de la sortie avant de faire votre correspondance.Avec des tuyaux nommés, vous allez réinventer Expect quand même.

Questions connexes