2013-03-01 42 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