Linux
期望腳本錯誤發送:Spawn id exp4 not open while execution
我正在嘗試執行此腳本,但修改時出現不同的錯誤。這是程式碼和輸出。請幫忙。
文章末尾的更新與調試資訊
#!/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