将expect“send”命令的输出设置为TcL变量

时间:2014-11-10 02:58:58

标签: tcl expect

我搜索了这个&我还没有找到真正适合我的答案。

我想设置通过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]

1 个答案:

答案 0 :(得分:0)

使用send命令后,需要使用expect命令获取所有show命令输出,例如

#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 *的原因。

更新:

默认情况下,expect缓冲区大小的限制足以保证模式可以匹配最后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
%

将缓冲区大小设置得足够大会降低脚本速度,但前提是输入不匹配。当字符到达时,模式匹配器必须在连续更长和更长的输入量上重试模式。所以保持缓冲区大小不超过你真正需要的是一个好主意。