2009-12-09 5 views
5

Estoy escribiendo un script Expect y estoy teniendo problemas para tratar con el intérprete de comandos del shell (en Linux). La secuencia de comandos Mi Esperanza genera rlogin y el sistema remoto está usando ksh. La solicitud en el sistema remoto contiene el directorio actual seguido de " > " (espacio mayor que espacio). Un fragmento de secuencia de comandos podría ser:¿Cómo puedo vaciar el búfer de entrada en un script esperado?

send "some command here\r" 
expect " > " 

Esto funciona para comandos simples, pero las cosas empiezan a ir mal cuando el comando que estoy enviando supera el ancho de la terminal (o más precisamente, lo que ksh piensa que es el ancho de la terminal). En ese caso, ksh hace un extraño desplazamiento horizontal de la línea de comando interactiva, que parece reescribir el mensaje y colocar un ">" extra en el resultado. Naturalmente, esto provoca que la secuencia de comandos Expect se confunda y se desincronice cuando parece haber más de un aviso en la salida después de ejecutar un comando (mi script contiene varios pares de send/expect).

He intentado cambiar PS1 en el sistema remoto a algo más distintivo como "prompt>", pero surge un problema similar que me indica que esa no es la manera correcta de resolver esto.

Lo que estoy pensando que podría ayudar es la capacidad de la secuencia de comandos para decirle Esperar que "Sé que estoy sincronizado correctamente con el sistema remoto en este momento, así que vacíe el búfer de entrada ahora". La instrucción expect tiene el indicador -notransfer que no elimina el búfer de entrada, incluso si el patrón no coincide, por lo que creo que necesito lo contrario.

¿Existen otras técnicas útiles que pueda utilizar para hacer que el shell remoto se comporte de manera más predecible? Entiendo que Expect realiza mucho trabajo para asegurarse de que la sesión generada aparezca como para que sea interactivo con el sistema remoto, pero prefiero algunas de las funciones interactivas más molestas (como el desplazamiento horizontal de ksh) ser apagado

Respuesta

7

Si quieres tirar toda la producción Esperar ha visto hasta ahora, tratar

expect -re $ 

este es un partido expresión regular en $ que significa el final de la memoria intermedia de entrada, por lo que sólo se saltará todo lo recibido por lo lejos. Más detalles en el Expect man page.

+0

Excelente, eso parece ser justo lo que necesitaba. –

1

Puede intentar "establecer -o multilínea" o COLUMNAS = 1000000 (o algún otro valor adecuadamente grande).

+0

El 'ksh' en este sistema no parece tener la opción' multiline', pero he descubierto que si 'set + o emacs' (desactivando la opción de edición de la línea emacs, que parece ser la por defecto aquí) entonces el desplazamiento horizontal también está deshabilitado. –

0

He tenido dificultades con ksh y esperar en el pasado. Mi solución fue usar algo que no sea ksh para un shell de inicio de sesión.

Si puede cambiar el inicio de sesión remoto a otro que no sea ksh (usando el comando chsh o editando/etc/passwd) entonces puede probar esto con/bin/sh como shell.

Otra alternativa es decirle a KSH que el terminal es un terminal tonto: no permitir que realice ningún procesamiento especial.

$ export TERM="" 

podría hacer el truco.

+0

Desafortunadamente, en esta situación, muchas otras cosas dependen de que el shell sea ksh. Trataré de desarmar 'TERM ', esa es una buena idea. –

Cuestiones relacionadas