HTTP 상태 코드가 200이 아닌 경우 exitCode가 0이 아닌 cURL이 실패하도록 할 수 있습니까?


239

curl이 HTTP 500 응답을 받았을 때 실패 (! = 0)를 의미하는 종료 코드를 반환한다고 가정했지만 항상 그렇지 않습니다 .

HTTP 상태 코드가 200이 아닌 경우 exitCode가 0이 아닌 cURL을 실패하게 만드는 방법이 있습니까? 내가 사용할 수는 -w "%{http_code}"있지만 종료 코드가 아닌 STDOUT에 넣습니다. (출력 외에도 파일로 리디렉션하고 싶지 않지만 화면으로 캡처하는 데 관심이 있습니다).

답변:


263

curl --fail 당신이 원하는 것의 일부를 수행합니다 :

부터 man curl:

-f, --fail

(HTTP) 서버 오류에서 자동으로 실패합니다 (아무 것도 출력되지 않음). 이것은 대부분 실패한 시도를보다 잘 처리하기 위해 스크립트 등을 더 잘 활성화하기 위해 수행됩니다. 일반적으로 HTTP 서버가 문서를 전달하지 못하면 HTML 문서를 리턴합니다 (이유 및 그 밖의 이유도 설명 함). 이 플래그는 curl이이를 출력하지 못하게하고 오류 22를 리턴합니다.

이 방법은 안전하지 않으며 인증이 실패 할 때 (응답 코드 401 및 407) 실패한 응답 코드가 미끄러지는 경우가 있습니다.

그러나 화면으로의 출력을 차단합니다.


2
그래서 그것의 어느 부분이하고하지 않습니까?
rogerdpack

5
@rogerdpack TL; 박사는 나쁜 반응을 감지 한 경우는 0이 아닌 리턴 않지만, 영업 이익 캡처에게 응답하지 것이다
rampion

3
이것은 HTTP 301 Move를 영구적으로 포착하지 않습니다. 컬은 여전히 종료 코드 0을 주었다
wisbucky

4
@wisbucky 301은 오류가 아니며 리디렉션 상태 코드입니다. 오류는 4xx 및 5xx 상태 코드입니다.
M. Justin

1
@wisbucky는 HTTP 오류 코드에서 0이 아닌 값을 종료 하고 HTTP 리디렉션을 올바르게 처리 하고이 질문 에 어떤 내용이 있는지 자세히 curl -f -L확인하십시오 . -L
노아 서스 먼

81

말린 페이지의 내용 만 표시하려면 다음을 수행하십시오.

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

이는 HTTP 상태 코드를 STDOUT에 쓰는 동안 페이지 컨텐츠를 STDERR에 기록하므로 변수 STATUSCODE에 지정할 수 있습니다 .


3
실패 (200이 아닌) 에 대한 응답을 출력하고 싶지만 0스크립트에서 비 상태 코드를 반환 하려면 어떻게해야합니까?
Justin

2
@ 저스틴 : if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi어때요?
ghoti

4
@ghoti : 부호없는 8 비트 종료 코드 만 지원되므로 약간 혼란 스러울 수 있습니다.
Dennis

3
아, 맞습니다. 코드는 8 비트로 줄 바꿈되므로 오류 404는 종료 값 148이되고 500은 244가됩니다. :-)
ghoti

7
하지 열려진 표준 출력에 대한 응답을, 리디렉션 동안 약간의 변형으로,이 변수의 코드를 캡처 : { code=$(curl ... as above ...); } 2>&1트릭은 { ... } 2>&1다른 쉘 등의 산란되지 동안 즉, 리디렉션을 허용 ( ... )것입니다.
Tobia

31

플래그 조합을 사용하여 수행 할 수있었습니다.

curl --silent --show-error --fail URL

--silent 는 진행률을 숨기고 오류
--show-error 는 요청이 실패하면 --silent
--fail에 의해 숨겨진 오류 메시지를 표시 합니다.


5
서버 응답이 표시되지 않습니다. 나는 OP가 아니지만 서버에서 본문으로 반환되는 오류 메시지를보고 싶었습니다. 게다가 --silent --show-error --fail작품과 동일합니다 -f/--fail.
낭비

1
사실, --fail종료 코드를 반환 22, 문서화 .
Quolonel Questions

2
@wisbucky 301은 오류가 아니며 리디렉션 상태 코드입니다. 오류는 4xx 및 5xx 상태 코드입니다.
M. Justin

4
@wisbucky에게 공정하게하기 위해, 원래의 질문은 "[...] HTTP 상태 코드가 200이 아닌 경우"라고 말합니다 . 이전에 "오류"에 대한 언급이 없습니다.
ken

2
curl 매뉴얼 페이지에 따르면 @ M.Justin :이 방법은 안전하지 않으며 특히 인증이 포함 된 경우 (응답 코드 401 및 407) 실패한 응답 코드가 미끄러지는 경우가 있습니다.
youfu

0

네, 할 수있는 방법이 있지만 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이 성공을 반환하는 경우를 찾을 수 없었습니다.


1
이것이 본질적으로 Ricardo Souza와 같은 대답입니까?
knocte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.