2013-04-26 77 views
3

我有我目前正在尋找多種提示類型和響應發送命令的expect腳本。我知道使用「-re」的正則表達式匹配,但我想知道實現此目的的正確方法。如何指望多個提示正確

例如,我有這些提示的類型:

[[email protected] ~]# 
[email protected] ---> 
/> 
-bash-3.00$ 
cli> 

這是正確的/足以表達來檢測上述所有?

set multiPrompt "(%|#|cli\>|\$|\-\-\-\>)" 
expect -re $multiPrompt 
send "$someCommand\r" 

此外,我有一個命令列表,其中一些導致提示在遠程系統上執行後進行更改。由於提示中的更改,其餘命令未發送,因爲我的期望腳本無法檢測到更改並執行發送操作。

我想要做的就是創建可能提示池,讓我期待的腳本跨發出的命令,而不會錯過其中任何一個。我的方法是否正確?

+0

這要看你可以期待一個提示旁邊什麼字符串響應。如果總是有提示,'。*'就足夠了。 – potrzebie 2013-04-26 07:02:16

+0

OTOH,它取決於你想要支持的不同提示和用戶。如果您的腳本僅用於自動化比爾蓋茨家用電腦,則應該將bill @ gates.com放在正則表達式中。如果您想支持所有提示,包括用戶自由修改的提示,那麼您的運氣不好。你不可能匹配。如果你想匹配世界上所有shell和程序的標準提示,祝你好運。 – potrzebie 2013-04-26 07:32:08

回答

3

在使用正則表達式來檢測提示是正確的事情,選擇一個好的是一個棘手當你有這樣一個廣泛的可能性。舉例來說,我敢打賭,這次重新將工作:

set multiPrompt {[#>$] } 

(它只是檢測提示結束,在此之前它忽略所有的東西幾乎總是有在提示符的後面加上一個空格,習慣了。視覺上分開哪些用戶從提示符下鍵入。)

然而,問題是,這RE是相當容易搭配其他的事情。相反,將提示更改爲已知和唯一值(通常通過在遠程設備上設置PS1環境變量)可能會更好,以便獲得可靠的檢測。你要知道,那是隻適合當你不暴露提示回給用戶,這對於期待一些用途,而不是別人真的...

+0

事實上,我已經通過更改PS1值來定製提示......這就是爲什麼「--->」提示。但是,我發送到遠程服務器的一些命令會導致提示改變。例如,我需要執行一個mysql查詢來獲取一些數據,這會將提示更改爲mysql一個 - 此時我的預期失敗,因爲提示是意外的。 – 2013-04-26 10:26:41

1

我知道這是一個古老的線程,但在這個人搜索我希望這幫助。我是一個UNIX系統管理員,並有我的程序調用各種管理功能的少數期望腳本。這是一個解決方案,我發現,在我所有的用例的工作原理:

set prompt "(%|#|>|\\$)" 

set prompt [string trim $prompt] 

[string trim $prompt]處理這樣一些提示有輸入之前的空間和一些由當它看起來在修剪掉的空間不會場景提示。例如:「密碼:」與「密碼:」