Как сохранить и проанализировать вывод команды в Expect? - PullRequest
3 голосов
/ 16 января 2010

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

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

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

Ответы [ 3 ]

7 голосов
/ 17 января 2010

Два совета по ожидаемому развитию:

  • autoexpect чтобы создать основу для вашей автоматизации
  • exp_internal 1, чтобы многословно показать, что ожидают делать изнутри. Это необходимо, когда вы не можете понять, почему ваше регулярное выражение не соответствует ожиданиям.
6 голосов
/ 16 января 2010

в основном, $ wait_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
4 голосов
/ 02 мая 2011

Я столкнулся и решил похожую проблему для взаимодействия с 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'.

...