我一直在自学期望脚本,并且我有一些关于期望脚本正则表达式的澄清问题。我创建了一个生成 Sun iLOM ssh 会话然后启用 SNMP 代理的代码。事实证明 iLOM2 和 iLOM3 处理这个过程的方式不同,所以我创建了这个脚本来解决这个问题。在试图弄清楚如何正确地进行正则表达式匹配时,我在网上遇到了许多相互冲突的解决方案,现在我很困惑。我找到的最好的帮助是expect 联机帮助页。我设法让某些东西起作用,但我担心我的解决方案很脏,并且与我找到的任何示例都不匹配。所以我的实际问题是:我的代码是如何工作的?有没有更好的办法?
我希望更多地了解 Expect 脚本,而不是盲目地将自定义解决方案组合在一起。
注意:同样,此代码有效。我想知道它是如何评估的。
要捕获的输出:
spawn ssh -o StrictHostKeyChecking=no root@<host>
Password:
Sun(TM) Integrated Lights Out Manager
Version 2.0.2.6
Copyright 2008 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
->
这个想法是捕捉“版本2”。然后从那里提取数字 2。
期望脚本片段:
set prompt "\\\->"
send "$pwd\r"
expect {
timeout { ...timeout action... }
$prompt { ...regex didn't match action... }
-indices -re {(Version (\d+).)} {
#Regex to find ILOM Version.
if {[info exists expect_out(2,string)]} {
set ilom_version $expect_out(2,string)
} else { ...regex didn't match properly action... }
expect $prompt
}
}
确切的正则表达式是-indices -re {(Version (\d+).)}。我花了很长时间才最终找出一种有效的语法,因为我上面链接的期望手册页有完全不同的示例。ie: -re "failed|invalid password"每当我采用这种语法时,一切都会崩溃。“版本”、版本、{版本}、(版本)全部失败。
所以我想我只是对我的代码是如何工作的以及为什么它与我发现的所有示例如此不同感到困惑。任何想法或建议将不胜感激。感谢您的时间。