Linux

期望腳本錯誤發送:Spawn id exp4 not open while execution

  • February 2, 2020

我正在嘗試執行此腳本,但修改時出現不同的錯誤。這是程式碼和輸出。請幫忙。

文章末尾的更新與調試資訊

   #!/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 root@$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

輸出如下:

   goldberg188@Test-Server ~$ ./test.sh "sudo cat /etc/hosts"
   spawn ssh -t root@10.10.10.10 sudo cat /etc/hosts
   root@10.10.10.10'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" }

   goldberg188@Test-Server ~$ ./test.sh "sudo cat /etc/hosts"
   spawn ssh -t root@10.10.10.10 sudo cat /etc/hosts
   root@10.10.10.10'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" }


   goldberg188@Test-Server ~$ ./test.sh "sudo cat /etc/hosts"
   spawn ssh -t root@10.10.10.10 sudo cat /etc/hosts
   root@10.10.10.10'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.

忽略編輯:我知道如何一次執行 2 個命令。

更新:調試資訊 - 修改為

   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" }

輸出:

   goldberg188@Test-Server ~$ ./test.sh "sudo cat /etc/host"
   spawn ssh -t root@10.10.10.10 sudo cat /etc/host
   root@10.10.10.10's password:
   expect: does "root@10.10.10.10'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) "root@10.10.10.10'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.
   root@10.10.10.10's password:
   expect: does " \r\nPermission denied, please try again.\r\r\nroot@10.10.10.10'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\nroot@10.10.10.10'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"

假設您不是故意發送錯誤的密碼,請exp_continue用作循環構造:

expect <<EOF
set passwds {foo bar baz}
set i 0
spawn ssh -t root@$server_address "$*"
expect {
   "continue connecting (yes/no)?" { send "yes\r"; exp_continue }
   " password: " { send "[lindex $passwds $i]\r"; incr i; exp_continue }
   eof
}
EOF

學分:格倫傑克曼

對不起格倫你的程式碼需要我在這裡添加並讓它工作的一些更改。

這是其他任何可能需要它的人的固定程式碼。您可以將 IP 放在一個文本文件中,然後在 servers_addresses 中添加 cat。像 servers_addresses=(‘cat ip_list.txt’)

在 IP 列表中添加這樣的 IP 10.10.10.1 10.10.10.2 10.10.10.3

如果需要,還可以提供更多範例。執行命令:

   ./test.sh "sudo cat /etc/hosts"

執行多個命令

   ./test.sh "sudo cat /etc/hosts & /etc/init.d/network status"

搜尋和替換

   ./test.sh "sed -i -e 's/SEARCH_STRING/REPLACE_STRING/g' /tmp/FileNAME.txt"

完整程式碼:

   #!/bin/bash
   (( $# != 1 )) && { echo >&2 "Usage: $0 \"[COMMAND]\""; exit 1; }
   servers_addresses=( 10.10.10.10 192.168.10.1 )
   for server_address in ${servers_addresses[@]}; do
       expect <<EOF
   set passwds { password1 password2 password3 }
   set i 0
   spawn ssh -t root@$server_address "$*"
   expect {
       "Are you sure you want to continue connecting (yes/no)?" { send "yes\r"; exp_continue }
       "s password:" { send "[lindex \$passwds \$i]\r"; incr i; exp_continue }
       eof
   }
   EOF
   done

引用自:https://serverfault.com/questions/642129