Esperar envio de erro de script: Spawn id exp4 não aberto durante a execução

4

Atualização: Código de trabalho adicionado aqui para outros

CRÉDITOS para: link

@Glenn Sinto muito! apenas me desculpando e estou falando sério!

Desculpe Glenn seu código precisa de algumas mudanças que estou adicionando aqui e funcionou. Graças à você! E desculpe pela minha grosseria. Aqui está o código fixo para qualquer outra pessoa que precise dele. Você pode colocar os IP's em um arquivo de texto e depois cat dentro dos servers_addresses. como servers_addresses = ('cat ip_list.txt') Na Lista de IP, adicione IPs como este 10.10.10.1 10.10.10.2 10.10.10.3

também mais exemplos, se necessário. Execute um comando:

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

Executar vários comandos

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

Pesquise e substitua

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

O código completo:

    #!/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

Estou tentando executar esse script, mas com erros diferentes quando modificado. Aqui está o código e a saída. Por favor ajude.

Atualizações no final da postagem com informações de depuração

    #!/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

E a saída é como:

    goldberg188@Test-Server ~$ ./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" }"

Se eu modificar assim, a saída seria um pouco diferente

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

E se a senha correta estiver na terceira linha, não haverá erros. Funciona bem com isso.

    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 [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.

Ignore as edições: Eu sei como executar 2 comandos de uma só vez.

Atualização: informações de depuração - modificadas para

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

Saída:

    goldberg188@Test-Server ~$ ./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"
    
por GoldFlake129 05.11.2014 / 10:32

2 respostas

4

Supondo que você não está enviando uma senha errada de propósito, use exp_continue como uma construção em loop:

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
    
por 05.11.2014 / 15:12
0

CRÉDITOS para: link

@Glenn Sinto muito! apenas me desculpando e estou falando sério!

Desculpe Glenn seu código precisa de algumas mudanças que estou adicionando aqui e funcionou. Graças à você! E desculpe pela minha grosseria. Aqui está o código fixo para qualquer outra pessoa que precise dele. Você pode colocar os IP's em um arquivo de texto e depois cat dentro dos servers_addresses. como servers_addresses = ('cat ip_list.txt') Na Lista de IP, adicione IPs como este 10.10.10.1 10.10.10.2 10.10.10.3

também mais exemplos, se necessário. Execute um comando:

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

Executar vários comandos

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

Pesquise e substitua

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

O código completo:

    #!/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
    
por 05.11.2014 / 21:34