* Re: [Comm] Expect
2006-11-22 17:12 ` Peter Volkov
@ 2006-11-22 17:59 ` Eugene Prokopiev
2006-11-23 7:23 ` Eugene Prokopiev
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Eugene Prokopiev @ 2006-11-22 17:59 UTC (permalink / raw)
To: ALT Linux Community
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 внутри?
--
С уважением, Прокопьев Евгений
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Expect
2006-11-22 17:12 ` Peter Volkov
2006-11-22 17:59 ` Eugene Prokopiev
@ 2006-11-23 7:23 ` Eugene Prokopiev
2006-11-23 7:58 ` Eugene Prokopiev
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Eugene Prokopiev @ 2006-11-23 7:23 UTC (permalink / raw)
To: ALT Linux Community
Теперь есть такой код:
expect {
"Welcome" {
expect {
"login: " { send "$username\r" }
}
expect {
"password: " { send "$password\r" }
}
expect "\$"
for {set i 1} {$i<7} {incr i} {
send "delete bridge port intf ifname eoa-$i\r"
expect {
"\$" { send_user "delete executed\n" }
default { send_user "delete execution failed:
$expect_out(buffer)\n" }
}
}
expect {
"\$" { send "exit\r" }
}
expect eof
}
}
Вывод:
login: admin
password: delete executed
delete executed
delete executed
delete executed
delete executed
delete executed
Login Successful
$delete bridge port intf ifname eoa-1
Error: Entry does not exist
$
execution error
Получается полная ерунда. send "delete ..." я выполнил 6 раз, а увидел
1, при этом "\$" я так и не дождался и вылетел по таймауту. Как такое
может быть?
--
С уважением, Прокопьев Евгений
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Expect
2006-11-22 17:12 ` Peter Volkov
2006-11-22 17:59 ` Eugene Prokopiev
2006-11-23 7:23 ` Eugene Prokopiev
@ 2006-11-23 7:58 ` Eugene Prokopiev
2006-11-23 8:25 ` Eugene Prokopiev
2006-11-23 9:35 ` Eugene Prokopiev
4 siblings, 0 replies; 7+ messages in thread
From: Eugene Prokopiev @ 2006-11-23 7:58 UTC (permalink / raw)
To: ALT Linux Community
еще более простой скрипт:
#!/usr/bin/expect -f
set timeout 5
spawn telnet 192.168.1.1
expect_after {
timeout { send_user "\nexecution error\n" ; exit 2 }
}
expect {
"Welcome" {
expect {
"login: " { send "admin\r" }
}
expect {
"password: " { send "admin\r" }
}
send "delete bridge port intf ifname eoa-1\r"
send "delete bridge port intf ifname eoa-2\r"
send "exit\r"
expect eof
}
}
send_user "executed\n"
exit 0
вывод:
login: admin
password:
Login Successful
$delete bridge port intf ifname eoa-1
Error: Entry does not exist
$
execution error
каким образом (из какого expect) теперь я вываливаюсь по таймауту?
закомментировал expect eof - оказалось из него. а почему тогда я не вижу
вывода второго delete?
--
С уважением, Прокопьев Евгений
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Expect
2006-11-22 17:12 ` Peter Volkov
` (2 preceding siblings ...)
2006-11-23 7:58 ` Eugene Prokopiev
@ 2006-11-23 8:25 ` Eugene Prokopiev
2006-11-23 9:35 ` Eugene Prokopiev
4 siblings, 0 replies; 7+ messages in thread
From: Eugene Prokopiev @ 2006-11-23 8:25 UTC (permalink / raw)
To: ALT Linux Community
"$" нужно ждать так: "\\$" ;)
помог expect -d
--
С уважением, Прокопьев Евгений
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Expect
2006-11-22 17:12 ` Peter Volkov
` (3 preceding siblings ...)
2006-11-23 8:25 ` Eugene Prokopiev
@ 2006-11-23 9:35 ` Eugene Prokopiev
4 siblings, 0 replies; 7+ messages in thread
From: Eugene Prokopiev @ 2006-11-23 9:35 UTC (permalink / raw)
To: ALT Linux Community
И все равно не понимаю:
expect {
"Welcome to MT800" {
expect {
"login: " { send "$username\r" }
}
expect {
"password: " { send "$password\r" }
}
for {set i 1} {$i<7} {incr i} {
send_user "i = $i\n"
expect {
"\\$" { send "delete bridge port intf ifname eoa-$i\r" }
}
}
expect {
"\\$" { send "exit\r" }
}
expect eof
}
}
На выводе получается жуткая мешанина:
login: admin
password: i = 1
Login Successful
$i = 2
delete bridge port intf ifname eoa-1
Error: Entry does not exist
$i = 3
delete bridge port intf ifname eoa-2
Entry Deleted
$i = 4
delete bridge port intf ifname eoa-3
Error: Entry does not exist
$i = 5
delete bridge port intf ifname eoa-4
Entry Deleted
$i = 6
delete bridge port intf ifname eoa-5
Error: Entry does not exist
$delete bridge port intf ifname eoa-6
Entry Deleted
$exit
Connection closed by foreign host.
Такое ощущение, что все операторы работают параллельно. А то, что иногда
получается, так это случайность :(
--
С уважением, Прокопьев Евгений
^ permalink raw reply [flat|nested] 7+ messages in thread