Как вы сохраняете и анализируете вывод команды в Expect?

Я на полпути к написанию сценария Expect на сервере Linux, который должен подключаться к маршрутизатору по telnet для сбора некоторой системной информации. Пока что мой скрипт может успешно установить соединение, запустить команду маршрутизатора, отключиться и завершить работу.

Команда отображает несколько строк, которые мне нужно проанализировать, что я не знаю, как это сделать в Expect. Как я могу сохранить вывод, найти строку, затем столбец из строки и, наконец, сохранить результат в файле? Если возможно, я хотел бы использовать Expect полностью, а не обходной путь (например, Expect, встроенный в Bash).

Спасибо за ваше время. jk04


person jk04    schedule 16.01.2010    source источник
comment
Можете ли вы показать нам пример вывода?   -  person glenn jackman    schedule 16.01.2010


Ответы (3)


Два совета по ожидаемой разработке:

  • autoexpect чтобы создать основу для вашей автоматизации
  • exp_internal 1 чтобы подробно показать, что ожидает внутри. Это необходимо, когда вы не можете понять, почему ваше регулярное выражение не отражает то, что вы ожидаете.
person glenn jackman    schedule 16.01.2010

в основном, $expect_out(buffer) [1]. содержит вывод из последнего ожидаемого совпадения с текущим. вы можете найти вывод своей команды там.

а для работы со строками вы можете просто использовать встроенный в tcl [2][3].

  1. "Как получить доступ к результату удаленной команды в Expect" http://wiki.tcl.tk/2958
  2. "regexp" http://wiki.tcl.tk/986
  3. "совпадение строк" http://wiki.tcl.tk/4385
person Dyno Fu    schedule 16.01.2010
comment
Я думаю, что $expect_out(buffer) содержит только текст, соответствующий вашему шаблону, а не весь текст из последнего ожидаемого совпадения с текущим. - person Colin Macleod; 17.01.2010
comment
я думаю, что нет, вы можете проверить, что обсуждение на expect_out(buffer) содержит содержимое предыдущей отправки, wiki.tcl. тк/17378 - person Dyno Fu; 17.01.2010
comment
я должен сказать да? поскольку текст, соответствующий текущему шаблону, является выводом от последнего ожидания к текущему:) - person Dyno Fu; 17.01.2010

Я столкнулся и решил аналогичную проблему для взаимодействия с bash. Я считаю, что этот подход можно обобщить на любую другую интерактивную среду, которая обеспечивает неоперабельный вывод с фиксированной строкой.

По сути, я оборачиваю команду двумя фиксированными строками, а затем ищу шаблон, включающий эти строки в начале и в конце, и сохраняю содержимое между ними. Например:

set var "";
expect $prompt { send "echo PSTART; $command; echo PEND;\r"; }
expect {
    -re PSTART\r\n(.*)PEND\r\n$prompt { set var [ string trim $expect_out(1,string) ]; send "\r"; }
    -re $prompt { set var "" ; send "\r"; }
    timeout { send_user "TIMEOUT\n"; exit }
}

Я подозреваю, что этот подход будет работать и с символами комментариев оболочки или с простой командой состояния, которая возвращает известный вывод.

Затем вы можете делать все, что вам нужно, с содержимым 'var'.

person stephen.z    schedule 02.05.2011