From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <45649012.8000904@stc.donpac.ru> Date: Wed, 22 Nov 2006 20:59:46 +0300 From: Eugene Prokopiev User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.7.2) Gecko/20040808 X-Accept-Language: ru-ru, ru MIME-Version: 1.0 To: ALT Linux Community References: <45644100.8010904@stc.donpac.ru> <1164215551.12822.1.camel@localhost> In-Reply-To: <1164215551.12822.1.camel@localhost> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Comm] Expect X-BeenThere: community@lists.altlinux.org X-Mailman-Version: 2.1.9rc1 Precedence: list Reply-To: ALT Linux Community List-Id: ALT Linux Community List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Nov 2006 18:00:37 -0000 Archived-At: List-Archive: List-Post: 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 внутри? -- С уважением, Прокопьев Евгений