내 목표는 SFTP 서버에서 파일 이름을 바꾸는 데 사용하고 이름 바꾸기에 실패하면 상태 코드 1로 예상을 종료하는 것입니다.
내 예상 스크립트는 잘 작동합니다. 이름이 성공적으로 바뀌었습니다.
이름 바꾸기에 실패하면 상태 코드로 종료하는 방법을 알 수 없습니다.
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
스크립트를 실행할 때의 출력은 다음과 같습니다.
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:~$>
이름 바꾸기가 실패할 경우 반환 코드 0으로 종료하기 위해 내가 할 수 있는 방법을 제안할 수 있는 사람이 있습니까?
추가 질문... 예상 스크립트 끝에서 종료하는 올바른 방법은 무엇입니까? 그 중 하나인가요?
exit
close
expect eof
감사해요!
답변1
해당 텍스트를 일치시키고 이에 대해 작업하여 이름 바꾸기 실패를 확인해야 합니다. 이는 추상화될 수 있습니다 proc
(TCL에서는 이를 서브루틴 또는 함수라고 부릅니다).
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
그때쯤이면 연결이 사라질 것으로 expect eof
예상하기 때문에 사용하겠습니다 .sftp
답변2
내 매뉴얼 페이지는 다음과 expect
같이 말합니다.
exit [-opts] [status]
[...] 상태(지정되지 않은 경우 0)는 Expect의 종료 상태로 반환됩니다.
그래서 당신은 단지 exit 1
.
세 가지 옵션은 EOF에 도달하기 위해 expect eof
명령이 expect
전달될 때까지 기다립니다. expect
나중에 스크립트를 계속할 수 있습니다. expect eof
이것이 옵션 중 하나일 뿐이거나 리모컨이 연결 끊김을 감지하여 오류로 처리할 수 있는 상황에서 유용합니다. (물론, 대화를 나누는 양측 모두 상대방이 멈출 때까지 기다리면 문제가 발생합니다.)
close
다른 프로세스에 대한 연결을 닫으므로 어떤 의미에서는 expect eof
. close
스크립트를 종료하기 전에 이를 사용하면 exit
will도 암시적으로 사용되기 때문에 많은 작업을 수행하지 않습니다 close
.
exit
그런 다음 스크립트를 종료하십시오 . 세 가지 중 선택은 수행하려는 작업에 따라 다릅니다. 종료하고 싶다면 그냥 말하고 exit
리모콘이 EOF를 처리하도록 하세요.