2010-11-24 209 views
1

我希望能夠通過一個長期命令來期待。不知怎的,這是一個多重命令。首先,這裏是我期待的腳本EXPECT如何將一個轉義字符解釋爲一個命令字符


#!/usr/bin/expect -f 
set timeout -1 
spawn telnet xxx.xxx.xxx.xxx 
expect "*?username:*" 
send "someusername\r" 
expect "*?assword:*" 
send "somepassword\r" 
# Here's the command I'd like to pass from the command prompt 
set command [lindex $argv 0] 
send "$command\r" 
send "exit\r" 

我會再運行該腳本這樣:

./expectscript "mkdir /usr/local/dir1\ncd /usr/local/dir1\ntouch testfile" 

注意,我把「\ n」來啓動進入,好像我處理命令前移到下一個。

我知道你可以用「;」來分隔命令,但是對於這個特殊練習,我希望能夠用「\ r」來解釋「\ n」,這樣期望會表現爲雖然它是這樣的:

send "mkdir /usr/local/dir1\r" 
send "cd /usr/local/dir1\r" 
send "touch testfile\r" 

接下來的問題就是如何能期待解釋「\ n」來爲「\ r」?我試過把「\ r」放在參數中而不是「\ n」,但那不起作用。

感謝您的意見。

回答

3

當我做一個簡單的實驗,我發現,在參數中\n不是由我的shell(bash)的成換行轉換;它仍然是一個文字。您可以通過只使用puts打印出來的命令行參數,像這樣的檢查了這一點自己:

puts [lindex $argv 0] 

解決此工作需要的工作分裂的東西一點點。唉,Tcl的split命令確實是而不是在多字符序列上分割(它一次分割多個不同的字符),所以我們需要一種不同的方法。但是,Tcllib正是我們所需要的:splitx命令。就這樣,我們這樣做(基於@ tensaix2j的答案):

#!/usr/bin/expect -f 
package require Expect;     # Good practice to put this explicitly 
package require textutil::split; # Part of Tcllib 

# ... add your stuff here ... 
foreach line [textutil::split::splitx [lindex $argv 0] {\\n}] { 
    send "$line\r" 
    # Wait for response and/or prompt? 
} 
# ... add your stuff here ... 

如果你沒有Tcllib安裝和配置與使用期望的那樣,你也可以SNARF爲splitx直接將代碼從代碼(在網上找到here),只要你在內部確認它的許可證(標準Tcl授權規則)即可。

+0

請注意,它是`{\\ n}`的正則表達式,因爲我們想匹配一個文字反斜槓-n,這就是最小化反斜槓的數量的形式,您必須編寫這些反斜槓才能使文字經過Tcl的解析和RE引擎解析... – 2010-11-24 10:34:17

0
foreach cmd [ split $command \n ] { 
send "$cmd\r\n" 
} 
+0

你幾乎肯定不希望在每個結尾處發送`\ n`。 – 2010-11-24 10:13:54

相關問題