2013-03-20 92 views
0

首先我需要說我使用公鑰和私鑰,但這並沒有解決我的問題。另外我知道我可以使用兩個腳本(一個使用password1,另一個使用password2)並運行它們兩次,但我想知道爲什麼下面的腳本不起作用。我試圖讓期望的腳本,將通過SSH連接,並檢查兩個密碼之一是否正確。對於這個我檢查腳本的退出代碼:expect - ssh - 兩個可能的密碼 - 或者如何跳過expect塊並仍然使用發送clausule

可以有遠程機器上更可能的登錄提示,我想使這個腳本儘可能通用,所以我不能依靠登錄提示字符串。到目前爲止,我有這樣的代碼:

#!/usr/local/bin/expect 
set username "username"; 
set remote_server "machine"; 
set password1 "badpassword"; 
set password2 "goodpassword"; 

set timeout 5; 
set pretype 0; 
set retcode 0; 


if { $pretype == 0 } { 
    spawn ssh -q ${username}@${remote_server} 
    expect { 
    "no)?" { send "yes\r"; } 
    "denied" { 
       puts "Can't login to $remote_server. Check username and password\n"; 
       set retcode 2; 
      } 
    "telnet:" { 
       puts "Can't connect to $remote_server via SSH or Telnet. Something went definitely wrong\n"; 
       set retcode 3; 
       } 
    "failed" { 
       puts "Host $remote_server exists. Check ssh_hosts file\n"; 
       set retcode 4; 
      } 
    timeout { 
       puts "Timeout problem. Host $remote_server doesn't respond\n"; 
       set retcode 5; 
      } 
    "refused" { 
       puts "Host $remote_server refused to SSH. That is insecure.\n"; 
       set retcode 6; 
       } 
    "assword:" { set pretype 1; send "${password1}\r"; } 
    } 
} else { 
    expect{ 
     "assword:" { send "${password2}\r"; exit 1; } 
     timeout { exit 0; } 
    } 
} 

這背後的想法是:若我輸入密碼錯誤,我將必須鍵入正確的第二次機會。所以,如果我第一次輸入錯誤的密碼,我的腳本應該繼續在其他分支(因爲我set pretype to 1)。在這裏,我會等待再次輸入密碼。所以我會發送第二個密碼並退出代碼1(密碼2是OK)。如果其他分支中的超時過期(「password:」字符串不匹配),最有可能我已經有登錄提示,所以腳本將退出代碼0(密碼1是OK)。但是這並沒有工作,如果我跑這裏面調試器,我看到的最後一行是:

send: sending "badpassword\r\r" to { exp4 } 

我不知道爲什麼會這樣,但似乎從來沒有劇本到達else分支。非常感謝

回答

1

set pretype 1if塊中不能使它再次進入else塊。沒有編程語言會這樣做。你需要像循環(使用whileexp_continue)這裏。

下面是一個例子:

#!/usr/bin/expect 

set passwords { bad1 bad2 bad3 good } 

spawn ssh -o PreferredAuthentications=keyboard-interactive \ 
      -o NumberOfPasswordPrompts=[llength $passwords] [email protected] 

set try 0 
expect { 
    "Password: " { 
     if { $try >= [llength $passwords] } { 
      send_error ">>> wrong passwords\n" 
      exit 1 
     } 

     send [lindex $passwords $try]\r 
     incr try 
     exp_continue 
    } 

    "bash-4.2" { 
     interact 
    } 

    timeout { 
     send_error ">>> timed out\n" 
     exit 1 
    } 
}