Esperar comando com múltiplos comandos

1

Como tenho problemas com meu servidor remoto [authorized_keys ...] eu escrevi um script em minha máquina local que usa o comando expect para ssh no servidor e, em seguida, execute cd e, em seguida, git pull

Mas não consigo fazer isso funcionar:

#!/usr/bin/expect
spawn ssh USER@IP_ADDRESS   
expect {
    "USER@IP_ADDRESS's password:"  {
        send "PASSWORD\r"
    }
    "[USER@server ~]$" {
        send "cd public_html"
    }
}   
interact

Eu preciso escapar de alguns chars? mesmo quando eu tento, ele ainda ignora o comando cd .

    
por Broshi 22.11.2016 / 09:42

1 resposta

2

[ é especial para o TCL, portanto, será necessário um tratamento adequado, seja por "\[quotes]" ou substituindo as aspas por chaves {[quotes]} . Um exemplo mais completo seria parecido com

#!/usr/bin/env expect

set prompt {\[USER@HOST[[:blank:]]+[^\]]+\]\$ }
spawn ssh USER@HOST

expect_before {
    # TODO possibly with logging, or via 'log_file' (see expect(1))
    timeout { exit 1 }
    eof { exit 1 }
}

# connect
expect {
    # if get a prompt then public key auth probably logged us in
    # so drop out of this block
    -re $prompt {}
    -ex "password:" {
        send -- "Hunter2\r"
        expect -re $prompt
    }
    # TODO handle other cases like fingerprint mismatch here...
}

# assuming the above got us to a prompt...
send -- "cd FIXMESOMEDIR\r"

expect {
    # TWEAK error message may vary depending on shell (try
    # both a not-exist dir and a chmod 000 dir)
    -ex " cd: " { exit 1 }
    -re $prompt {}
}

# assuming the above got us to a prompt and that the cd was
# properly checked for errors...
send -- "echo git pull FIXMEREMOVEDEBUGECHO\r"

expect -re $prompt
interact
    
por 22.11.2016 / 16:36

Tags