我一直在教自己期待脚本编写,我对预期脚本正则表达式有一些澄清问题。我创建了一个代码,该代码生成Sun iLOM ssh会话,然后启用SNMP代理。事实证明,iLOM2和iLOM3处理此过程的方式不同,因此我创建此脚本来解决该问题。在试图弄清楚如何正确匹配正则表达式时,我在网上遇到了许多相互矛盾的解决方案,现在我很困惑。我找到的最好的帮助是expect manpage。我设法得到一些工作,但我担心我的解决方案是脏的,它与我找到的任何一个例子都不匹配。所以我的实际问题是:我的代码如何工作?有没有更好的办法?
我希望更多地了解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。
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“失败|无效密码”每当我采用该语法时,一切都会崩溃。 “版本”,版本,{版本},(版本)全部失败。
所以我想我只是对我的代码如何工作以及为什么它与我发现的所有示例如此不同感到困惑。任何想法或建议将不胜感激。感谢您的时间。
答案 0 :(得分:1)
正则表达式是{}
附带的正则表达式。
(Version (\d+).)
它将匹配一个包含Version
的字符串,后跟一个空格,然后是一个或多个数字,后跟任意一个字符。点是匹配任何字符的通配符;如果您想匹配文字.
使用\.
。
您已将模式括在()
中,因此整个匹配将被捕获并保存在expect_out(1,string)
中。但是作为 a)你没有使用整个匹配,而 b)整个匹配自动保存在expect_out(0,string)
中,外部括号是不必要的。< / p>
您还将\d+
括在括号中,以便捕获版本号的前导数字并保存在expect_out(2,string)
中,但如果您按照上面的建议移除外部括号,则会保存在expect_out(1,string)
。
数字后面的.
或\.
实际上并没有任何用途,除非阻止匹配(如果该字符不存在)。
-indices
标志是不必要的,因为您没有寻找匹配的索引。
否则,您提取版本号的方法看起来很好 - 尽管我对Expect几乎一无所知:)