我一直在教自己期望腳本,並且我有一些關於期望腳本正則表達式的澄清問題。我創建了一個生成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