首页 > 解决方案 > 期望从输出中获取指定信息

问题描述

我正在尝试构建一个脚本来收集我们的 Cisco 设备的信息。我正在使用 bash 并调用 Expect 以向设备发送命令。我能够发送命令并通过日志功能获取输出。我想做的是获取“序列号:SERIAL_NUMBER”行的输出

这是我到目前为止所拥有的:

/usr/bin/expect << EOF
set timeout 5
spawn ssh $Username@$IP ena\r$Password\rshow version \rexit\r
expect "password"
send "$Password\r"
expect -re {^[Serial Number: ].+}
puts "S/N: $expect_out(4,string)"
expect "*#"
expect eof
EOF

我收到以下错误:

S/N: (4,string)
expect: spawn id exp4 not open

我尝试使用其他 spawn_ID 并仍然得到相同的错误。我不是 100% 确定 tcl 是如何工作的,所以如果有人可以帮助我。

干杯,

标签: bashtclexpect

解决方案


我怀疑问题是这样的:

expect -re {^[Serial Number: ].+}
puts "S/N: $expect_out(4,string)"

它应该是:

expect -re {^[Serial Number: ](.+)}
puts "S/N: $expect_out(1,string)"

我在正则表达式中放置了一个“捕获组”,然后我选择该组进行打印,expect_out(1,string)因为它是第一个这样的捕获组;它们从一开始编号(因为零是整个匹配的字符串,在使用 expect 时通常不需要)。


当然,这假设代码完全可以工作。如果连接的另一端决定告诉你离开,expect 脚本将会失败。你应该打开调试模式来期待,看看到底发生了什么。您绝对应该查看此问题的答案以了解调试方法。

期望脚本日志记录未完成


推荐阅读