Programmed Dialogue with Interactive Programs

PDIP est le sigle de Programmed Dialogue with Interactive Programs (« Dialogue programmé avec des programmes interactifs », tiré des premières lignes du manuel d'Expect).

C'est une version simplifiée de l’utilitaire expect. Comme lui, PDIP interprète un script de commandes pour dialoguer avec un programme interactif[1] comme le ferait un opérateur humain. Mais il n’a pas toutes les possibilités de expect qui est capable d'interagir avec plusieurs programmes en même temps, d'accepter un langage de commandes de haut niveau offrant les branchements et des structures de contrôle de haut niveau et de redonner le contrôle à l’opérateur en cours de session.

PDIP accepte un langage très simple en entrée pour fournir des fonctions de base :

  • Filtrage de la sortie du programme pour se caler sur une chaîne de caractères se conformant à un modèle
  • Envoi de chaînes de caractères au programme
  • Arrêt des interactions avec le programme pendant une durée donnée en secondes

PDIP est disponible en logiciel libre sur sourceforge[2].

Codage modifier

La ligne de commandes de PDIP se présente comme suit :

          pdip [-s cmdfile] [-b buffer-size] [-dhV] -- commande [param1 param2...]
La commande à lancer avec ses options et paramètres est spécifiée à la fin de la ligne de  commande.
Si des options sont passées à pdip et/ou à la commande, alors la commande doit être précédée d’un double
tiret (--).  Sinon  les  options  seront  toutes passées à pdip et entraîneront des erreurs.


PDIP lit cmdfile ou son entrée standard (défaut) et accepte les commandes suivantes :

      #...  # et les mots suivants jusqu’à la fin de la ligne sont ignorés (utilisé pour les commentaires)
      timeout x
            Positionne à x secondes le temps maximum à attendre après chacune des commandes qui  suivent (la
            valeur 0 annule le temporisateur, c’est le comportement par défaut)
      recv "w1 w2..."
            Attend  une ligne venant du programme se conformant au modèle w1 w2...  Le modèle est une expression
            régulière se conformant à regex.
      send "w1 w2..."
            Envoie la chaîne de caractères w1 w2... au programme. La chaîne peut contenir les  caractères de
            contrôle suivants:
                         \a Cloche
                         \b Retour arrière
                         \t Tabulation horizontale
                         \n Retour à la ligne
                         \v Tabulation verticale
                         \f Saut de page
                         \r Retour chariot
                         \" Guillemet
                         \\ Barre oblique inversée
      sleep x
            Arrête toute activité pendant x secondes
      exit  Termine PDIP


Les options passées au programme sont :

      -b buffer-size | --bufsz=buffer-size
             Taille en octet du buffer interne (par défaut : 512).
      -d | --debug
             Active le mode mise au point. C’est très utile pour comprendre pourquoi un script ne marche pas comme souhaité.
      -h | --help
             Affiche l’aide de la commande (sous-ensemble de cette page de manuel).
      -s cmdfile | --script=cmdfile
             Script de commandes en entrée (défaut : stdin).
      -V | --version
             Affiche la version du logiciel.

Voici quelques exemples d'utilisation :

L’exemple suivant montre la mise en œuvre d’une connexion telnet vers un hôte appelé ’remote’ sur le port 34570 avec le nom de login ’foo’ et le mot de passe ’bar’. Comme le numéro de port distant est spécifié à l’aide d’une option (-p), il faut faire précéder la commande d’un double tiret (--). Les commandes sont injectées sur l’entrée standard. On attend le prompt ’$’ et on lance la commande ls avant de se déconnecter du shell via la commande exit.

            $ pdip -- telnet -p 34570 remote
            recv "login"
            send "foo\n"   # Nom de login ’foo’
            recv "Password"
            send "bar\n"   # Mot de passe ’bar’
            recv "\$ "     # Inhibition du caractère spécial ’$’ avec ’\’
            send "ls\n"    # Lance la commande ’ls’
            recv "\$ "
            send "exit\n"  # Sortie du shell
            exit           # Sortie de PDIP
            $

L’exemple suivant montre la mise en œuvre d’une connexion telnet vers un hôte appelé ’remote’ avec le nom de login ’foo’ et le mot de passe ’bar’. Les commandes sont injectées sur l’entrée standard. On attend le prompt ’$’ et on lance la commande ls avant de se déconnecter du shell via la commande exit.

            $ pdip telnet remote
            recv "login"
            send "foo\n"   # Nom de login ’foo’
            recv "Password"
            send "bar\n"   # Mot de passe ’bar’
            recv "\$ "     # Inhibition du caractère spécial ’$’ avec ’\’
            send "ls\n"    # Lance la commande ’ls’
            recv "\$ "
            send "exit\n"  # Sortie du shell
            exit           # Sortie de PDIP
            $

L’exemple suivant montre la mise en œuvre d’une connexion ftp vers un hôte appelé ’remote’ avec le nom de login ’foo’ et le mot de passe ’bar’. Les commandes sont injectées sur l’entrée standard. On attend l’apparition du prompt ’ftp>’ en début de ligne et on lance la commande ’help’ avant de se déconnecter de ftp avec la commande ’quit’.

            $ pdip ftp remote
            recv "Name"
            send "foo\n"    # Nom de login ’foo’
            recv "Password"
            send "bar\n"    # Mot de passe ’bar’
            recv "^ftp> "   # Prompt en début de ligne
            send "help\n"   # Lancement de la commande help
            recv "^ftp> "
            send "quit\n"   # Sortie de FTP
            exit            # Sortie de PDIP
            $

L’exemple suivant met en œuvre une session avec la calculatrice bc qui a la particularité de ne pas afficher de prompt en début de ligne de commande. On utilise le méta caractère ’$’ pour se synchroniser sur les fins de ligne. Deux opérations sont lancées ’3+4’ et ’6*8’. Ensuite on quitte bc.

            $ pdip bc
            recv "warranty"  # Vers la fin de la bannière de démarrage
            recv "$"         # Fin de la dernière ligne de la bannière
            send "3+4\n"
            recv "$"         # Réception de la fin de ligne de l’écho
            recv "$"         # Réception de la fin de ligne du résultat
            send "6*8\n"
            recv "$"
            recv "$"
            send "quit\n"   # Sortie de BC
            exit            # Sortie de PDIP
            $

L’exemple suivant met en œuvre une session telnet vers un hôte appelé ’remote’ avec un nom de login ’foo’ et un mot de passe ’bar’. Les commandes sont injectées sur l’entrée standard. Avec une expression régulière, on attend un prompt de la forme "....-<login_name>-pathname> " ou "....-<login_name>-pathname>" en début de ligne. Ensuite la commande ’ls -l’ est lancée avant de se déconnecter de telnet(1) avec la commande ’exit’.

            $ pdip telnet remote
            recv "login:"
            send "foo\n"                  # Nom de login ’foo’
            recv "Password:"
            send "bar\n"                  # Mot de passe ’bar’
            recv "^(.)+-foo-(.)+(>|> )$"  # Prompt en début de ligne
            send "ls -l\n"                # Lance la commande ’ls -l’
            recv "^(.)+-foo-(.)+(>|> )$"
            send "exit\n"                 # Sortie de telnet
            exit                          # Sortie de PDIP
            $

Notes et références modifier