Как мне сказать, ожидать, что я закончил интерактивный режим? - PullRequest
5 голосов
/ 09 апреля 2011

Я пишу некоторые ожидаемые команды в bash.

Сценарий:

#!/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\" }  
}    

"  

Мои намерения в сценарии: сначала разрешить ему подключиться к компьютеру, когда он увидит Prompt1, дать ему контроль, я выполню команду для загрузки определенного изображения. Затем подождите, пока не появится Prompt2 (который указывает, что изображение было загружено). Затем пусть он выполнит дальнейший набор команд.

После запуска скрипта я мог войти в интерактивный режим, загрузить свое изображение. Проблема в том, чтобы выйти из интерактивного режима на удаленном компьютере и вернуть ему контроль.

Ошибка, которую я получил:

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

Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 09 апреля 2011

Ваша проблема двоякая ...

  1. Вы должны взаимодействовать с явным return и дать ему возможность узнать, что вы освободили контроль ... в этом случае я использую три знака плюс и нажимаю ввод.

  2. После того, как вы вернете элемент управления, сценарию потребуется снова получить приглашение, что означает, что первое, что вы должны сделать после возврата элемента управления - это отправить еще один \r. Я отредактировал то, что я думаю, что вы пытаетесь сделать ...

Пример следует ...

#!/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 голосов
/ 09 апреля 2011

Спасибо, Майк, за это предложение. Я немного подправил его и адаптировал к своей проблеме.

Измененный код:

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

Значение тайм-аута 10 не связано с set timeout -1, который мы установили изначально. Следовательно, я могу выполнять любые команды на Prompt1, и если клавиатура простаивает в течение 10 секунд, сценарий снова получает управление.

Даже после этого я столкнулся с еще одной проблемой: после Prompt1 я хотел выполнить команду для загрузки определенного изображения. Загрузка изображения занимает около 2 минут. Даже с set timeout -1 сценарий ожидал ожидания Prompt2. Это даже не тайм-аут telnet, который я проверил. Но решением для этого является добавление exp_continue в случае тайм-аута в операторе ожидаемого.

Чтобы ваш set timeout -1 вступил в силу, он должен быть помещен перед командой spawn telnet в пределах ожидаемого.

...