2016-08-15 70 views
1

我正在嘗試使用expect實用程序來自動化腳本執行期間需要輸入密碼的任務。期望腳本條件方案

expect -c "set timeout 120; 
spawn /bin/bash /home/user/script.sh; 

# Expect 1 - not expected always 
expect \"Are you sure you want to continue connecting (yes/no)?\"; send "yes\r"; 

# Expect 2 - not expected always 
expect \"Please type 'yes' or 'no':\"; send \"yes\r\"; 

# Expect 3 - this is required always to input the password 
expect \"[email protected]'s password:\"; send \"password\r\"; expect eof" 

從上面的腳本中,期望1和2條件並不總是必需的。它僅在對新服務器執行腳本時需要。一旦主機的身份被添加到已知主機,腳本就不會提示前2個預期條件。期望3是大多數情況下要滿足的唯一條件。

在一個系統中,主機標識已經存在,期望腳本執行第一個條件並保持到達到超時並且不會期望3.我不知道如何實現這個,但是在那裏如果沒有達到提示,這種方法可能會中斷。

+3

http://stackoverflow.com/q/1538444/1005215 –

+1

期望不是bash的一部分,它不是特定於bash,它不隨bash一起發運,它甚至不使用bash引擎它基於的語言是TCL)。你可以在沒有安裝bash的情況下運行expect腳本。 bash標籤在特定問題中沒有地位。 –

+0

謝謝,期望命令本身不是根據腳本bash。我想要執行的script.sh是一個bash腳本,但是這就是爲什麼我要調用bash可執行文件 – user6930

回答

3

expect命令有超時,我忘了多久,但只是幾秒鐘。如果沒有找到您期望的內容,則會發生超時並且expect命令將退出。考慮到這一點,我已將超時設置爲1秒,似乎可行。您可能需要將其調整到您的系統。

#!/usr/bin/env tclsh 
package require Expect 

spawn /bin/bash /home/user/script.sh 

# Time out (in seconds) for the expect commands 
set timeout 1 

expect "Are you sure you want to continue connecting (yes/no)? " { send "yes\r" } 
expect "Please type 'yes' or 'no':" { send "yes\r" } 
expect "[email protected]'s password:" { send "password\r" } 
interact 

有兩點要注意:

  1. 這個腳本是不是一個bash腳本。這是一個帶有Expect包的TCL腳本。我建議這樣做,因爲TCL非常有能力,但不太難學。
  2. timeout值是這裏的關鍵。您甚至可能希望在每個expect命令之前設置不同的超時值以定製腳本的響應時間。
  3. timeout設置爲120太長:每個expect命令都需要等待2分鐘才能繼續,此時,系統可能會超時,然後才能進入下一個expect命令。

祝你好運。

+0

/home/user/script.sh需要大約60秒才能執行,最糟糕的情況是我希望腳本失敗,如果它超過120秒。 – user6930