ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [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