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
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 $