Meu objetivo é renomear um arquivo em um servidor sftp usando esperar, E se a renomeação falhar, sair esperando 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 posso fazer para sair com o código de retorno zero se a renomeação falhar?
Pergunta bônus... qual é a maneira correta de sair no final do meu script esperado? É um desses?
exit
close
expect eof
obrigado!
Você precisa verificar uma falha de renomeação combinando esse texto e agindo sobre ele. Isso pode ser abstraído em um
proc
(o que o TCL chama de sub-rotina ou função).Eu usaria
expect eof
como esperaria que asftp
conexão desaparecesse nesse ponto.Minha página man para
expect
diz:Então você simplesmente quer
exit 1
.Quanto às suas três alternativas,
expect eof
esperaria o comandoexpect
que está falando para chegar ao EOF. Você pode continuar oexpect
script 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á-la um erro. (É claro que se ambos os lados da conversa esperam que o outro pare, então eles estão presos.)close
fecharia a conexão com o outro processo, portanto, no sentido de agir como o inverso deexpect eof
. Novamente, seu script pode continuar depois disso. Usarclose
um pouco antes de sair do script não faz muito, pois umexit
também faráclose
.Então há
exit
que sai do seu script. Escolher entre os três depende do que você quer fazer. Se você quiser sair, eu diria apenasexit
e deixe o controle remoto lidar com o EOF.