[Comm] Expect

Eugene Prokopiev prokopiev на stc.donpac.ru
Ср Ноя 22 20:59:46 MSK 2006


Peter Volkov пишет:
> On Срд, 2006-11-22 at 15:22 +0300, Eugene Prokopiev wrote: 
> 
>>1) почему скрипт не дожидется \$ ?
> 
> 
> А вы уверены, что у вас промпт именно такой. 
> echo \'$PS1\' # ? ;)

$ echo \'$PS1\'
'[\u@\h \W]\$ '

К желаемому результату привело "\$ "

>>2) почему abort (описанный в мане) - invalid command name?
> 
> 
> Читайте внимательней man: 
> (Note that abort is presumed to be a procedure defined elsewhere in the script.)
> 
> В expect такой команды нет.

да, прошу прощения, ошибся

>>3) можно ли упростить код, приняв что-то вроде "timeout { abort }" за 
>>поведение по умолчанию, чтобы в основном коде остались только expect и send?
> 
> 
> Можно. expect_before или expect_after именно те тулзы, которые вам
> помогут в этом.

В чем-то помогают:

#!/usr/bin/expect -f

if "$argc > 0" {
     set hostname    [lindex $argv 0]
     set username    [lindex $argv 1]
     set password    [lindex $argv 2]
}

set timeout 5

spawn telnet $hostname

expect_after {
     timeout         { send_user "\nexecution error\n" ; exit 2 }
}

expect {
     "login: "       { send "$username\r" }
}

expect {
     "Password: "    { send "$password\r" }
}

expect {
     "\$ "           { send "ls\r" }
}

expect {
     "\$ "           { send "exit\r" }
}

expect eof

send_user "executed\n"
exit 0

Но остается необходимость в коде, обрамляющем send "ls\r" и send 
"exit\r". Поскольку он дублируется, то хотелось бы от него избавиться. 
Т.е. в основном коде мы просто передаем данные, а проверка на наличие 
приглашения (или какого-то признака удачного выполнения) осуществляется 
сама собой. Правильно ли я понял, что send этого не умеет, и придется 
писать обертку с send и expect внутри?

-- 
С уважением, Прокопьев Евгений


Подробная информация о списке рассылки Community