2012-10-26 34 views
0

我想創建一個expect腳本將發送基於不同的密碼字符串的「期望」做出決策期望返回

  • 條件A:如果思科設備尚未安裝使用用戶名那麼第一個提示將簡單地爲「密碼:」 - 那麼它應該使用passwordA(沒有用戶名)

  • 條件B:如果它已經用用戶名設置,則提示符將是「用戶名:」,後跟「密碼:「 - 那麼它應該使用用戶名和密碼B

#!/bin/bash 
# Declare host variable as the input variable 
host=$1  
# Start the expect script 
(expect -c " 
set timeout 20 
# Start the session with the input variable and the rest of the hostname 
spawn telnet $host 
set timeout 3 
if {expect \"Password:\"} { 
send \"PasswordA\"} 
elseif { expect \"Username:\"} 
send \"UsersName\r\"} 
expect \"Password:\" 
log_user 0 
send \"PasswordB\r\" 
log_user 1 
expect \"*>\" 
# send \"show version\r\" 
# set results $expect_out(buffer) 
#expect \"Password:\" 
#send \"SomeEnablePassword\r\" 
# Allow us to interact with the switch ourselves 
# stop the expect script once the telnet session is closed 
send \"quit\r\" 
expect eof 
") 
+0

問題不是很清楚 –

+0

如果您使用單引號括住期望腳本本身,而不是雙引號,那麼您會讓代碼更加惱火。需要更少的反斜槓...... –

回答

3

你就錯了。 :)

expect語句不會看到什麼是第一個,它會等待,直到它看到您所要求的(並超時如果它沒有及時到達),然後運行您傳遞給的命令它。我認爲你可以像你想要的那樣使用它,但它不好。

expect可以選擇要查找的替代方法列表,如C switch語句或shell case語句,這就是您需要的。

沒有測試這一點,但你想要的應該是這個樣子:

expect { 
    -ex "Username:" { 
    send "UsersName\r" 
    expect -ex "Password:" {send "PasswordB\r"} 
    } 
    -ex "Password:" {send "PasswordA\r"} 
} 

在的話,預計會尋找任何「用戶名」和「密碼:」(-ex手段完全匹配,無正則表達式),以先到者爲準,並運行與之相關的命令。


在迴應的意見,我會嘗試這樣的第二個密碼(假設登錄成功給人以「#」提示符):

expect { 
    -ex "Username:" { 
    send "UsersName\r" 
    expect -ex "Password:" {send "PasswordB\r"} 
    } 
    -ex "Password:" { 
    send "PasswordA1\r" 
    expect { 
     -ex "Password:" {send "PasswordA2\r"} 
     -ex "#" {} 
    } 
    } 
} 

可以做到不看爲#提示,但你不得不依靠第二Password:期望超時,這是不理想的。

+0

另外要知道的是,你可以在響應體中使用'exp_continue'來使包含'expect'的等待。這對於處理用戶名/密碼很有用,終止的情況下在目標系統上看到提示... –

+0

除此之外,在這種情況下,'Password:'可以表示兩種不同的事情。 – ams

+0

非常感謝你的AMS!這工作!我最近發現在第一個密碼(沒有用戶名)不起作用的情況下需要使用另一個密碼。 所以期待將是「密碼:」發送密碼A 如果密碼失敗,那麼相同的期望「密碼:」將被返回,然後我應該發送PasswordB在第二個實例 – user1776732