2014-11-05 372 views
1

我試圖運行此腳本,但在修改時發生了不同的錯誤。這裏是代碼和輸出。請幫忙。在後與調試信息期望腳本錯誤發送:Spawn id exp4在執行時未打開

#!/bin/bash 
    (($# != 1)) && { echo >&2 "Usage: $0 \"[COMMAND]\""; exit 1; } 
    servers_addresses=(10.10.10.10) 
    for server_address in ${servers_addresses[@]}; do 
    expect <<EOF 
    spawn ssh -t [email protected]$server_address "$*" 
    expect -timeout 2 "Are you sure you want to continue connecting (yes/no)?" { send "yes\n" } 
    expect "s password:" { send "Correct_Password\n" } 
    expect "s password:" { send "Wrong_Password_22222\n" } 
    expect "s password:" { send "Wrong_Password_33333\n" } 
    expect eof 
    EOF 
    done 

結束

更新和輸出是這樣的:

[email protected] ~$ ./test.sh "sudo cat /etc/hosts" 
    spawn ssh -t [email protected] sudo cat /etc/hosts 
    [email protected]'s password: 
    # Do not remove the following line, or various programs 
    # that require network functionality will fail. 
    10.10.10.10    TEST-004 localhost.localdomain localhost 
    ::1    localhost6.localdomain6 localhost6 
    Connection to 10.10.10.10 closed. 
    expect: spawn id exp4 not open 
     while executing 
    "expect "s password:" { send "Wrong_Password_33333\n" }" 

如果我修改這個樣子,那麼輸出會有所不同

expect "s password:" { send "Wrong_Password_11111\n" } 
    expect "s password:" { send "Correct_Password\n" } 
    expect "s password:" { send "Wrong_Password_33333\n" } 

    [email protected] ~$ ./test.sh "sudo cat /etc/hosts" 
    spawn ssh -t [email protected] sudo cat /etc/hosts 
    [email protected]'s password: 
    # Do not remove the following line, or various programs 
    # that require network functionality will fail. 
    10.10.10.10    TEST-004 localhost.localdomain localhost 
    ::1    localhost6.localdomain6 localhost6 
    Connection to 10.10.10.10 closed. 
    expect: spawn id exp4 not open 
     while executing 
    "expect eof" 

如果在第三行輸入正確的密碼,那麼根本沒有錯誤。在這一個上運行得很好。

expect "s password:" { send "Wrong_Password_11111\n" } 
    expect "s password:" { send "Wrong_Password_22222\n" } 
    expect "s password:" { send "Correct_Password\n" } 


    [email protected] ~$ ./test.sh "sudo cat /etc/hosts" 
    spawn ssh -t [email protected] sudo cat /etc/hosts 
    [email protected]'s password: 
    # Do not remove the following line, or various programs 
    # that require network functionality will fail. 
    10.10.10.10    TEST-004 localhost.localdomain localhost 
    ::1    localhost6.localdomain6 localhost6 
    Connection to 10.10.10.10 closed. 

更新:調試信息 - 修正至

exp_internal 1 
    expect "s password:" { send "Wrong_Password_11111\n" } 
    expect "s password:" { send "Correct_Password\n" } 
    expect "s password:" { send "Wrong_Password_33333\n" } 

輸出:

[email protected] ~$ ./test.sh "sudo cat /etc/host" 
    spawn ssh -t [email protected] sudo cat /etc/host 
    [email protected]'s password: 
    expect: does "[email protected]'s password: " (spawn_id exp4) match glob pattern "s password:"? yes 
    expect: set expect_out(0,string) "s password:" 
    expect: set expect_out(spawn_id) "exp4" 
    expect: set expect_out(buffer) "[email protected]'s password:" 
    send: sending "Wrong_Password_11111\n" to { exp4 } 

    expect: does " " (spawn_id exp4) match glob pattern "s password:"? no 


    expect: does " \r\n" (spawn_id exp4) match glob pattern "s password:"? no 
    Permission denied, please try again. 
    [email protected]'s password: 
    expect: does " \r\nPermission denied, please try again.\r\r\[email protected]'s password: " (spawn_id exp4) match glob pattern "s password:"? yes 
    expect: set expect_out(0,string) "s password:" 
    expect: set expect_out(spawn_id) "exp4" 
    expect: set expect_out(buffer) " \r\nPermission denied, please try again.\r\r\[email protected]'s password:" 
    send: sending "Correct_Password\n" to { exp4 } 

    expect: does " " (spawn_id exp4) match glob pattern "s password:"? no 


    expect: does " \r\n" (spawn_id exp4) match glob pattern "s password:"? no 
    cat: /etc/host: No such file or directory 
    Connection to 10.10.10.10 closed. 

    expect: does " \r\ncat: /etc/host: No such file or directory\r\r\nConnection to 10.10.10.10 closed.\r\r\n" (spawn_id exp4) match glob pattern "s password:"? no 
    expect: read eof 
    expect: set expect_out(spawn_id) "exp4" 
    expect: set expect_out(buffer) " \r\ncat: /etc/host: No such file or directory\r\r\nConnection to 10.10.10.10 closed.\r\r\n" 
    expect: spawn id exp4 not open 
     while executing 
    "expect eof" 
+0

注意:同樣的問題在serverfault:http://serverfault.com/q/642129/30957 – 2014-11-05 19:21:37

回答

1

根據你的代碼,它看起來像ssh連接得到的給予了幾條小道後關閉密碼ssh會話。

每當有一個新進程產生spawn命令,則expect會將該預期進程的spawn_id保存爲expect_out(spawn_id)。當它遇到

 spawn ssh -t [email protected]$server_address "$*" 

您已如下圖所示的調試產生

根據你的代碼,期望的spawn_id在。

spawn ssh -t [email protected] sudo cat /etc/host 
    [email protected]'s password: 
    expect: does "[email protected]'s password: " (spawn_id exp4) match glob pattern "s password:"? yes 
    expect: set expect_out(0,string) "s password:" 
    expect: set expect_out(spawn_id) "exp4" 

正如你可以在調試信息看到,expect_out(spawn_id)持有由它來期待這是你的情況exp4spawn_id

正如您所看到的,連接在幾條錯誤路徑後關閉,從而使進程exp4不再在上下文中退出。由於spawn_id認爲是相同的,期望會嘗試期望從該過程中失敗。

你可以參考this問才知道這個spawn_id正在如何與

+0

感謝您的努力。我會嘗試添加更多或改進它,但我找到了一個修復時間。檢查我最新帖子上的鏈接。再次感謝你! – 2014-11-05 20:59:04