1

我一直在自学期望脚本,并且我有一些关于期望脚本正则表达式的澄清问题。我创建了一个生成 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"每当我采用这种语法时,一切都会崩溃。“版本”、版本、{版本}、(版本)全部失败。

所以我想我只是对我的代码是如何工作的以及为什么它与我发现的所有示例如此不同感到困惑。任何想法或建议将不胜感激。感谢您的时间。

4

1 回答 1

1

正则表达式是用{}.

(Version (\d+).)

它将匹配一个字符串,该字符串Version后跟一个空格,然后是一个或多个数字,后跟任何字符之一。点是匹配任意字符的通配符;如果你想匹配文字.使用\.

您已将模式包含在其中,()因此整个匹配项将被捕获并保存在expect_out(1,string). 但是作为a)您没有使用整个匹配,并且b)无论如何都会自动保存整个匹配expect_out(0,string),因此不需要外括号。

您还包含了\d+中括号,因此版本号的前导数字将被捕获并保存在 中expect_out(2,string),但是如果您按照上面的建议删除外括号,它将保存在expect_out(1,string).

数字后面的the.或 a\.并没有真正起到任何作用,除了如果该字符不存在则阻止匹配。

-indices标志是不必要的,因为您不是在寻找匹配的索引。

否则,您提取版本号的方法看起来不错 - 虽然,我对 Expect 几乎一无所知 :)

于 2013-03-01T18:58:48.540 回答