2011-04-09 23 views
5

Estoy escribiendo algunos comandos de espera en bash.¿Cómo puedo esperar que haya terminado el modo interactivo?

Guión:

#!/bin/bash 
set timeout -1 

expect -c " 

spawn telnet $IP $PORT1 
sleep 1 
send \"\r\" 
send \"\r\" 
expect Prompt1> 
interact timeout 20 { 
sleep 1 
} 

expect { 
Prompt2> {send \"dir\r\" } 
}  

" 

Mis intenciones con el guión son, en primer lugar dejar que telnet en una máquina, cuando se ve PROMPT1, dejar que se dan el control a mí, voy a ejecutar un comando para cargar una imagen específica . Luego espere hasta que se muestre Prompt2 (que indica que la imagen se ha cargado). Entonces deja que ejecute el conjunto adicional de comandos.

Después de ejecutar el script, pude entrar en el modo interactivo, cargar mi imagen. El problema es salir del modo interactivo en la máquina remota y devolverle el control.

el error que llegué:

expect: spawn id exp4 not open 
    while executing 
"expect -nobrace Prompt2 {send "dir\r" }" 
    invoked from within 
"expect {  
Prompt2 {send "dir\r" } 
}" 

¿Cómo puedo hacer esto?

+0

¿Cómo piensa salir del modo interacción? ¿Es esto esperando 'prompt2'? –

+0

El valor de tiempo de espera de 20, supuse que me sacaría. ¿Me equivoco aquí? Una vez que salga, quiero que Espere retome el control y espere la Prompt2. Entonces puede ejecutar el conjunto adicional de comandos. – Pkp

Respuesta

6

Su problema es doble ...

  1. Usted debe interactuar con un explícito return, y darle un poco manera de saber que ha salido de control ... en este caso, utilizo tres más signos y presionar enter.

  2. Después de volver de control, el guión se necesita para obtener el indicador, lo que significa que lo primero que haces después de devolver el control a esperar es enviar otra \r. He editado por lo que creo que estamos tratando de hacer ...

ejemplo sigue ...

#!/bin/bash 
set timeout -1 

expect -c " 

spawn telnet $IP $PORT1 
sleep 1 
send \"\r\" 
send \"\r\" 
expect Prompt1> 
interact +++ return 

send \"\r\" 
expect { 
Prompt2> {send \"dir\r\" } 
} 
" 
0

Gracias Mike por esa sugerencia. Lo puse un poco y lo adapté a mi problema.

código modificado: Se

expect Prompt1> 
interact timeout 10 return 
expect { 
timeout {exp_continue} 
Prompt2 {send \"dir\r\" } 
} 

El tiempo de espera de 10 valor no está relacionado con la set timeout -1 nos propusimos albergar dudas. Por lo tanto, puedo ejecutar los comandos que desee en Prompt1 y una vez que el teclado esté inactivo durante 10 segundos, la secuencia de comandos recuperará el control.

Incluso después de esto me enfrenté a un problema más, después de Prompt1, quería ejecutar el comando para cargar una imagen en particular. La carga de la imagen tarda alrededor de 2 minutos. Incluso con set timeout -1, el script agotó el tiempo de espera para Prompt2. No es el tiempo de espera de telnet incluso, lo que he verificado. Pero la solución para esto es agregar exp_continue en caso de tiempo de espera dentro de la instrucción de esperar.

Para que su set timeout -1 tenga efecto debe colocarse antes del comando spawn telnet dentro de lo esperado.

Cuestiones relacionadas