2009-09-24 14 views
7

He heredado una aplicación de línea de comandos interactiva de 20 años que ya no es compatible con su proveedor. Necesitamos automatizar algunas tareas en esta aplicación.¿Cómo puedo controlar una aplicación interactiva de Unix mediante programación a través de Perl?

El más problemático de estos es la creación de miles de nuevos registros con parámetros ligeramente diferentes (por ejemplo, diferentes identificadores, diferentes nombres). Los registros deben crearse en secuencia, uno a la vez, lo que tomaría muchos meses (y, por lo tanto, dólares) para hacerlo manualmente. En la mayoría de los casos, la creación de un registro tiene un patrón muy predecible de introducción de comandos, lectura de respuestas, introducción de comandos adicionales, etc. Sin embargo, algunas operaciones de creación de registros darán lugar a condiciones de error ('registro con este identificador ya existe') que requieren un conjunto diferente de comandos para salir con gracia.

puedo ver algunas maneras diferentes de hacer esto:

  • Las canalizaciones con nombre. Escriba una secuencia de comandos Perl que ejecute la aplicación de destino con STDIN y STDOUT en conductos con nombre, luego envíe a la aplicación de destino la secuencia de comandos para crear un registro con los parámetros necesarios y luego instruya a la aplicación de destino para que salga y se cierre. A continuación, ejecutamos el script tantas veces como sea necesario con diferentes parámetros.

  • Aplicación. Encuentre otra herramienta de Unix que se pueda usar para guiar programas interactivos. Los únicos que he podido encontrar son expect, pero esto no parece mantenerse; y chat, que recuerdo desde hace años, y que parece hacer más o menos lo que quiero, pero parece ser solo para controlar módems.

Una posible complicación más: creo que la aplicación de destino fue escrito para un terminal VT100 y utiliza algún tipo de secuencias de escape para hacer cosas como dar relieve.

Mi pregunta es ¿qué enfoque debo tomar? ¿Uno de estos, o algo completamente diferente? Me gusta bastante la idea de utilizar conductos con nombre y luego tener un script Perl que abre los FIFO y lee y escribe según sea necesario, ya que proporciona mucha flexibilidad, pero por lo que he leído parece que hay muchos problemas potenciales si Voy por este camino.

Gracias de antemano.

+1

espera ahora en sourceforge http://sourceforge.net/projects/expect/ – Mark

+0

Actualización: Tengo las características de una solución usando Expect.pm. Gracias a todos los que respondieron. Puedo SSH al servidor de prueba, iniciar la aplicación y comenzar a interactuar con ella. Parece que los códigos de control VT100 son bastante simples. Actualmente no tengo una cuenta, pero he aprendido algunos nombres de usuario, así que estoy pensando que mi primera prueba de automatización real será un ataque de diccionario en la cuenta demostradora ... –

Respuesta

12

Definitivamente me apegaré a Perl por la flexibilidad adicional, como sugería el caos. ¿Conoce el Expect perl module? Es mucho más agradable que el enfoque de tubería nombrada.

Tenga en cuenta también que con las canalizaciones con nombre, no puede forzar la salida de la salida de la aplicación heredada, lo que podría ser molesto. I think Expect.pm usa pseudo-ttys para evitar este problema, pero no estoy seguro. Consulte la discusión en perlipc en la sección "Bidirectional Communication with Another Process" para obtener más detalles.

+0

No estaba al tanto del módulo Expect Perl, así que le doy un giro. Parece prometedor hasta el momento, aunque la documentación es un poco clara, probablemente necesite leer el original. –

4

expect es mucho más sólida de lo que probablemente le está dando crédito, pero si fuera usted, seguiría con la opción Perl, queriendo tener un lenguaje de programación completo y familiar para gestionar el proceso y tener Confianza en que cualquier problema extraño que surja, habrá formas de abordarlos.

4

Esperar, ya sea con el Tcl o Perl implementation s, sería mi primer intento. Si está viendo secuencias impares en la salida porque está haciendo extrañas cosas en la terminal, simplemente filtre esas de la salida antes de hacer su coincidencia.

Con los tubos con nombre, va a terminar reinventando Espere de todos modos.

Cuestiones relacionadas