我一直在教自己期望脚本,并且我有一些关于期望脚本正则表达式的澄清问题。我创建了一个生成Sun iLOM ssh会话的代码,然后启用SNMP代理。事实证明iLOM2和iLOM3处理这个过程的方式不同,所以我创建了这个脚本来解决这个问题。在试图弄清楚如何正确匹配正则表达式时,我在网上遇到了许多相互矛盾的解决方案,现在我感到很困惑。我找到的最好的帮助是expect manpage。我设法得到了一些工作,但我担心我的解决方案很脏,并且与我找到的任何示例都不匹配。所以我真正的问题:我的代码是如何工作的?有没有更好的办法?期望脚本正则表达式评估的澄清
我希望能够更多地了解Expect脚本,而不是盲目地将自定义解决方案组合在一起。
NOTE:此代码仍然有效。我想了解它如何评估。
输出捕捉:
spawn ssh -o StrictHostKeyChecking=no [email protected]<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。
Expect脚本片段:
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 {(版(\ d +)。)}。我花了很长时间才最终找出可行的语法,因为我上面链接的期望手册页有完全不同的例子。即:-re“失败|无效密码”每当我采用该语法时,一切都会崩溃。 “版本”,版本,{版本},(版本)全部失败。
所以我想我只是困惑我的代码是如何工作,为什么它是如此不同于我发现的所有例子。任何想法或建议,将不胜感激。感谢您的时间。
谢谢MikeM。所以我只用'$ expect_out(1,string)'测试了'-r {Version(\ d +)}',它起作用了! 我想当我尝试这种方法之前,它一定是失败了,因为我没有调整$ expect_out变量来找到新的匹配索引。另外,我正在使用追踪期来防御贪婪的加法运算符;但是,它看起来没有必要。 酷!我对此感觉更好。谢谢。 唉,我不到15个代表,所以我不能给你+1。如果我能做到的话。 – Burns 2013-03-01 19:23:15