2014-11-10 3 views
1

Я искал это & Я не нашел ответа, который действительно работает для меня.Установить вывод из команды «отправить» в качестве переменной TcL

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

что-то вроде этого:

send "show interface status" 

#output of show command on device 
Port  Name    Status  Vlan  Duplex Speed Type 
Gi1/1  trunk to switch notconnect 100   auto auto 10/100/1000-TX 
Gi1/2  this is a test por notconnect 100   auto auto 10/100/1000-TX 
Gi1/3      notconnect routed  auto auto 10/100/1000-TX 
Gi1/4      notconnect 400   auto auto 10/100/1000-TX 

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

set showInterface [split [exec "show interface status"] \n] 

ответ

0

После использования команды send, вам нужно использовать expect команду, чтобы получить все выходные что-то показать команду, как,

#This is a common approach for few known prompts 
#If your device's prompt is missing here, then you can add the same. 
set prompt "#|>|:|\\\$"; # We escaped the `$` symbol with backslash to match literal '$' 

#Your code to telnet to the device here... 

# This is to clean up the previous expect_out(buffer) content 
# So that, we can get the exact output what we need. 
expect *; 

send "show interface status\r"; # '\r' used here to type 'return' .i.e new line 
expect -re $prompt; # Matching the prompt with regexp 

#Now, the content of 'expect_out(buffer)' has what we need 
set output $expect_out(buffer); 

set interfaces [ split $output \n ]; # Getting each interfaces info in a list. 

Вы можете посмотреть here, чтобы узнать больше о том, зачем вам нужно expect *.

Update:

По умолчанию предел размера буфера expect «s достаточно, чтобы гарантировать, что шаблоны могут соответствовать до последних 2000 байт вывода. Это всего лишь количество символов, которые могут поместиться на 25-строчный столбец 80 столбцов. (i.e.25 * 80 = 2000)

Максимальный размер совпадений, который expect гарантирует, что он может быть выполнен с помощью команды match_max. В качестве примера следующая команда гарантирует, что expect может соответствовать выходу программы до 10000 символов.

match_max 10000 

На рисунке дано match_max не максимальное число символов, которые могут совпадать. Скорее всего, это минимальное количество символов, которые можно сопоставить. Или иначе, можно сопоставить больше, чем текущее значение, но более крупные совпадения не гарантируются. Без аргументов match_max возвращает значение для текущего процесса.

% 
% package require Expect 
5.43.2 
% match_max 
2000 
% match_max 10000 
% match_max 
10000 
% 

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

+0

Это отлично работает, но кажется, что $ expect_out (buffer) недостаточно велик для хранения вывода. Регулируется ли размер буфера? Например, если вы хотите «cat» файл, а затем проанализировать вывод с помощью TcL? – Cory