expect - como sair com o código de status 1 se um comando falhar?

1

Meu objetivo é renomear um arquivo em um servidor sftp usando expect, e se a renomeação falhar, sair espere retornar um código de status de 1

Meu script de espera funciona bem - ele renomeia com sucesso.

Não consigo descobrir como sair com um código de status se a renomeação falhar.

ubuntu@ip-10-0-0-138:~$> cat expect_script.txt
spawn sftp -o "StrictHostKeyChecking no" [email protected]
expect "password:"
send "somesupersecretpassword\n"
expect "sftp>"
send "rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4\n"
expect "sftp>"
send "rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4\n"
expect "sftp>"
send "bye\n"
expect "#"
exit

Aqui está a saída quando executo meu script:

ubuntu@ip-10-0-0-138:~$> expect -f expect_script.txt
spawn sftp -o StrictHostKeyChecking no [email protected]
[email protected]'s password:
Connected to nginx.localvpc.
sftp> rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4
rename /var/www/static/tmp-93121715.mp4  /var/www/static/91329728.mp4
sftp> rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4
rename /var/www/static/91329728.mp4  /var/www/static/tmp-93121715.mp4
sftp> bye
bye
ubuntu@ip-10-0-0-138:~$>

Alguém pode sugerir o que eu posso fazer para sair com o código de retorno zero se a renomeação falhar?

Pergunta de bônus ... qual é a maneira correta de sair no final do meu script de espera? É um desses?

exit
close
expect eof

obrigado!

    
por Duke Dougal 23.08.2018 / 01:49

2 respostas

1

Você precisa verificar uma falha na renomeação, combinando esse texto e agindo nele. Isso pode ser abstraído em um proc (o que o TCL chama de sub-rotina ou função).

spawn ...
set ret 0
expect "sftp>"
proc sftp_rename {from to} {
    global ret
    send "rename $from $to\n"
    expect {
        -ex "Couldn't" { set ret 42; exp_continue }
        "sftp>"
    }
}
sftp_rename /var/www/static/tmp-93121715.mp4 /var/www/static/91329728.mp4
sftp_rename /var/www/static/91329728.mp4 /var/www/static/tmp-93121715.mp4
send "bye\n"
expect eof
exit $ret

Eu usaria expect eof , pois esperaria que a conexão sftp fosse embora naquele momento.

    
por 23.08.2018 / 02:17
1

Minha página man para expect diz:

exit [-opts] [status]

[...] status (or 0 if not specified) is returned as the exit status of Expect.

Você simplesmente quer exit 1 .

Quanto às suas três alternativas, expect eof aguardaria o comando com o qual o expect está falando para atingir o EOF. Você pode continuar o script expect depois disso. expect eof é útil nos casos em que essa é apenas uma das opções, ou quando o controle remoto pode detectar a desconexão e considerá-lo como um erro. (Claro que se ambos os lados da conversa esperarem que o outro pare, então eles estão presos.)

close fecharia a conexão com o outro processo, portanto, em sentido agindo como o contrário de expect eof . Novamente, seu script pode continuar depois disso. Usar close antes de sair do script não faz muito, pois exit implicitamente também close .

Depois, há exit que sai do seu script. Escolher entre os três depende do que você quer fazer. Se você quiser sair, eu diria apenas exit e deixe o controle remoto lidar com o EOF.

    
por 23.08.2018 / 02:09

Tags