curl이 HTTP 500 응답을 받았을 때 실패 (! = 0)를 의미하는 종료 코드를 반환한다고 가정했지만 항상 그렇지 않습니다 .
HTTP 상태 코드가 200이 아닌 경우 exitCode가 0이 아닌 cURL을 실패하게 만드는 방법이 있습니까? 내가 사용할 수는 -w "%{http_code}"
있지만 종료 코드가 아닌 STDOUT에 넣습니다. (출력 외에도 파일로 리디렉션하고 싶지 않지만 화면으로 캡처하는 데 관심이 있습니다).
답변
curl --fail
당신이 원하는 것의 일부를 수행합니다 :
부터 man curl
:
-f, --fail
(HTTP) 서버 오류에서 자동으로 실패합니다 (아무 것도 출력되지 않음). 이것은 대부분 실패한 시도를보다 잘 처리하기 위해 스크립트 등을 더 잘 활성화하기 위해 수행됩니다. 일반적으로 HTTP 서버가 문서를 전달하지 못하면 HTML 문서를 리턴합니다 (이유 및 그 밖의 이유도 설명 함). 이 플래그는 curl이이를 출력하지 못하게하고 오류 22를 리턴합니다.
이 방법은 안전하지 않으며 인증이 실패 할 때 (응답 코드 401 및 407) 실패한 응답 코드가 미끄러지는 경우가 있습니다.
그러나 화면으로의 출력을 차단합니다.
답변
말린 페이지의 내용 만 표시하려면 다음을 수행하십시오.
STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)
if test $STATUSCODE -ne 200; then
# error handling
fi
이는 HTTP 상태 코드를 STDOUT에 쓰는 동안 페이지 컨텐츠를 STDERR에 기록하므로 변수 STATUSCODE에 지정할 수 있습니다 .
답변
플래그 조합을 사용하여 수행 할 수있었습니다.
curl --silent --show-error --fail URL
–silent 는 진행률을 숨기고 오류
–show-error 는 요청이 실패하면 --silent
–fail에 의해 숨겨진 오류 메시지를 표시 합니다.
답변
네, 할 수있는 방법이 있지만 3 가지 컬 옵션이 포함되어 있기 때문에 분명하지 않습니다.
curl -s --fail --show-error https://httpbin.org/status/200 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/401 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/404 > /dev/null
curl -s --fail --show-error https://bleah-some-wrong-host > /dev/null
이것은 최종 2xx
리턴 코드로 curl end-us를 수행 할 때만 성공 (0)이 발생 stdout
하고 본문 을 가져오고 오류가 stderr에 표시되도록합니다.
curl 문서는 –fail이 일부 401 코드에서 성공할 수 있다고 언급하기 때문에 약간 혼동 될 수 있습니다. 적어도 –show-error와 동시에 사용될 때는 사실이 아닌 테스트를 기반으로합니다.
지금까지 curl이 이러한 옵션을 사용하는 http가 아닌 경우 curl이 성공을 반환하는 경우를 찾을 수 없었습니다.