* [Comm] Expect
@ 2006-11-22 12:22 Eugene Prokopiev
2006-11-22 17:12 ` Peter Volkov
0 siblings, 1 reply; 7+ messages in thread
From: Eugene Prokopiev @ 2006-11-22 12:22 UTC (permalink / raw)
To: Community
Здравствуйте!
Есть такой expect-скрипт:
#!/usr/bin/expect -f
set timeout 5
spawn telnet localhost
expect {
"ogin:" { send -- "test\r" }
timeout { abort }
}
expect {
"assword:" { send -- "1\r" }
timeout { abort }
}
expect {
"\$" { send -- "ls\r" }
timeout { abort }
}
expect {
"\$" { send -- "exit\r" }
timeout { abort }
}
exit 0
Вывод:
$ ./login.exp
spawn telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
login: test
Password:
Last login: Wed Nov 22 15:15:13 2006 from localhost.localdomain on pts/7
-bash-2.05b$ invalid command name "abort"
while executing
"abort "
invoked from within
"expect -nobrace {$} { send -- "ls\r" } timeout { abort }"
invoked from within
"expect {
"\$" { send -- "ls\r" }
timeout { abort }
}"
(file "./login.exp" line 17)
Вопросы:
1) почему скрипт не дожидется \$ ?
2) почему abort (описанный в мане) - invalid command name?
3) можно ли упростить код, приняв что-то вроде "timeout { abort }" за
поведение по умолчанию, чтобы в основном коде остались только expect и send?
--
С уважением, Прокопьев Евгений
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Comm] Expect
2006-11-22 12:22 [Comm] Expect Eugene Prokopiev
@ 2006-11-22 17:12 ` Peter Volkov
2006-11-22 17:59 ` Eugene Prokopiev
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Peter Volkov @ 2006-11-22 17:12 UTC (permalink / raw)
To: ALT Linux Community
[-- Attachment #1: Type: text/plain, Size: 878 bytes --]
On Срд, 2006-11-22 at 15:22 +0300, Eugene Prokopiev wrote:
> 1) почему скрипт не дожидется \$ ?
А вы уверены, что у вас промпт именно такой.
echo \'$PS1\' # ? ;)
> 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 именно те тулзы, которые вам
помогут в этом.
Peter.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ 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
` (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
end of thread, other threads:[~2006-11-23 9:35 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-11-22 12:22 [Comm] Expect Eugene Prokopiev
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
ALT Linux Community general discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
public-inbox-index community
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.community
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git