2013-03-01 45 views
1

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

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

回答

1

正则表达式是{}所包含的正则表达式。

(Version (\d+).) 

它将匹配含有随后Version一个空格然后一个或多个数字后跟任意字符的一个字符串。点是匹配任何字符的通配符;如果要匹配字面.,请使用\.

您已将此模式包含在()中,因此整个比赛将被捕获并保存在expect_out(1,string)中。但作为a)你没有使用整个比赛,b)整个比赛自动保存在expect_out(0,string)无论如何,外括号是不必要的。

你还用括号括起来的\d+这样的版本号的前几位将被捕获并保存在expect_out(2,string),但如果你把外支架按照以上建议,它将被保存在expect_out(1,string)

.或后面的数字并没有真正用于任何目的,除了防止匹配,如果这个角色是不是有\.

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

否则,你提取版本号的方法看起来不错 - 虽然我几乎不知道期望:)

+1

谢谢MikeM。所以我只用'$ expect_out(1,string)'测试了'-r {Version(\ d +)}',它起作用了! 我想当我尝试这种方法之前,它一定是失败了,因为我没有调整$ expect_out变量来找到新的匹配索引。另外,我正在使用追踪期来防御贪婪的加法运算符;但是,它看起来没有必要。 酷!我对此感觉更好。谢谢。 唉,我不到15个代表,所以我不能给你+1。如果我能做到的话。 – Burns 2013-03-01 19:23:15