我搜索了这个&我还没有找到真正适合我的答案。
我想设置通过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 :(得分: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
%
将缓冲区大小设置得足够大会降低脚本速度,但前提是输入不匹配。当字符到达时,模式匹配器必须在连续更长和更长的输入量上重试模式。所以保持缓冲区大小不超过你真正需要的是一个好主意。