¿Cómo puedo vaciar el búfer de entrada en una secuencia de comandos esperar?

StackOverflow https://stackoverflow.com/questions/1877015

  •  18-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo un guión de esperar y estoy teniendo problemas para lidiar con el intérprete de comandos (en Linux). Mi esperar guión genera rlogin y el sistema remoto está utilizando ksh. El símbolo en el sistema remoto contiene el directorio actual seguido por " > " (espacio mayor que el espacio). Un fragmento de secuencia de comandos podría ser:

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 algo raro desplazamiento horizontal de la línea de comandos interactiva, que parece volver a escribir el mensaje y pegar un extra ">" en la salida. Naturalmente, esto hace que el script Expect a confundirse y fuera de sincronización cuando parece que hay más de un mensaje en la salida después de ejecutar un comando (mi script contiene varios pares send / expect).

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

Lo que estoy pensando ayuda poder es la capacidad para que el guión para contar esperar que "sé que estoy debidamente sincronizado con el sistema remoto en este momento, así que vaciar el buffer de entrada ahora." La declaración expect tiene la bandera -notransfer la que no se descarta el buffer de entrada incluso si el patrón coincide, por lo que creo que necesito lo contrario de eso.

¿Hay otras técnicas útiles que puedo usar para hacer que el shell remoto se comportan de forma más predecible? Yo entiendo que esperan que pasa a través de una gran cantidad de trabajo para asegurarse de que la sesión generado aparece para ser interactivo con el sistema remoto, pero yo prefiero que algunas de las características interactivas más molestos (como el el desplazamiento horizontal de ksh) se apagará.

¿Fue útil?

Solución

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

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 hasta el momento. Más detalles en la esperar página del manual .

Otros consejos

Usted podría tratar de "establecer líneas múltiples -o" o columnas = 1000000 (o algún otro valor suficientemente grande).

he tenido dificultad con ksh y esperar que en el pasado. Mi solución fue usar algo distinto ksh para un shell de entrada.

Si se puede cambiar el nombre de usuario remoto para que no sea ksh (mediante el comando chsh o modificación de / etc / passwd), entonces usted puede intentar esto con / bin / sh como la cáscara.

Otra alternativa es contar KSH que el terminal es un terminal tonto - no permitir que hagan ningún proceso especial.

$ export TERM=""

puede hacer el truco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top