HTTP 상태 코드를 출력하기 위해 컬이 발생합니까?


799

내가 사용하고 curlHTTP 요청을 발행 할 리눅스 명령 줄에서. 응답 본문은 표준 출력으로 인쇄되지만 문제는 매뉴얼 페이지에서 응답 (404, 403 등)에서 HTTP 상태 코드를 인쇄하기 위해 컬을 얻는 방법을 알 수 없습니다. 이게 가능해?


필자는 매뉴얼에서 HTTP 상태 코드를 얻는 방법을 알 수 있지만 -w 옵션은 작동하지 않습니다. 버그를 Apple에보고했습니다.
Nicolas Barbulesco

19
-i플래그에서와 같이 curl -i https://www.example.com/, 당신이에 따라, 원하는 아마도 superuser.com/a/514798/190188
까악 까악

왜 안되나요 curl -IL http://www.example.com | grep "^HTTP\/"?
St3an

미래의 자기 자신에게 : 당신이 원하는 대답은 아마도 Cyril David의 것입니다 (현재 4 위)
WhiteHotLoveTiger

답변:


526

웹 서버가 HEAD 요청에 응답 할 수있는 경우 작동 합니다 (을 수행하지 않음 GET).

curl -I http://www.example.org

또한 cURL이 리디렉션 (3xx 상태)을 따르도록하려면 -L을 추가하십시오.


155
NB : curl -I일부 웹 응용 프로그램 서버 및 서비스에 대한 HTTP 상태 코드를 테스트하는 데 문제가 될 수있는 HEAD HTTP 요청을 수행합니다.
Jay Taylor

16
상태 번호 만 가져 오려면head -n 1|cut -d$' ' -f2
Benubird

33
curl의 stderr을 리디렉션하는 것을 잊지 마십시오 : curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2. 리디렉션 후 최종 상태가 필요한 경우 컬하려면 -L을 추가하십시오.
Aaron Blenkush

1
HEAD 요청 만 수행 한 후 리디렉션을 수행하면 앱의 프로그래밍 방식에 따라 흥미로운 동작이 발생할 수 있습니다.
Scott McIntyre

31
curl -I -X GETGET 요청을 보내지 만 동일한 출력을 제공합니다.
jiggy

835

HTTP 상태 코드 인쇄하는보다 구체적인 방법 은 다음과 같습니다.

curl -s -o /dev/null -w "%{http_code}" http://www.example.org/

구문 분석이 필요하지 않으므로 스크립트에서 작업하기가 훨씬 쉽습니다. :-)

-I응답로드 성능을 향상시키기 위해 매개 변수 가 추가 될 수 있습니다. 이 매개 변수는 다운로드 응답 본문없이 응답 상태 / 헤더 만 요청합니다.

참고 : %{http_code} HTTP 페이로드의 첫 번째 줄에서 반환

즉 :

curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/

54
-w "% {http_code}"는 상태 코드를 인쇄하는 비트입니다. 본문에서 코드를 분리하기 위해 줄 바꿈 두 개를 추가 할 수 있습니다 (-w "\ n \ n % {http_code} \ n")
Jeffrey Martinez

7
와우, 이것은 /dev/null내가 사용하는 Windows 버전의 curl에서도 작동합니다.
Uwe Keim

3
전체 파일이 / dev / null로 이동하더라도 전체 파일을 다운로드하므로 대용량 파일의 상태 코드를 확인하는 데 적합하지 않습니다. httping -c 1 -s -G -m이 질문이 컬에 관한 것임을 알고 있지만 GET을 발행하고 전체 파일을 다운로드하지는 않습니다.
RomanSt

40
참고 : -s= 다운로드 진행률 -o /dev/null표시 안 함, -w "%{http_code}"= 본문 표시 안함 , = 종료 후 http 응답 코드를 stdout에 씁니다.
Ajedi32

1
"% {http_code}"주위의 따옴표가 필요합니까?
Hakan Baba

216

결과뿐만 아니라 헤더를 보려면 verbose 옵션을 사용할 수 있습니다.

curl -v http://www.example.org
curl --verbose http://www.example.org

상태가 헤더에 나타납니다. 예 :

< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity

26
verbose 플래그를 지정하기위한 +1은 추가 세부 사항을 제공합니다. REST 앱 테스트에 좋습니다.
MrOodles

8
POST 요청을 할 때 +1 매우 쉬운 (컬 -v --data "...") 사용
MegaTux

1
심지어 두 개의 서로 다른 파일 출력으로 나눕니다 (http 상태 세부 정보는 stderr로, 응답 본문은 stdout으로)
Blauhirn

201

다음을 수행하여 모든 헤더 외에 상태 코드를 인쇄 할 수 있습니다.

curl -i http://example.org

좋은 점은 -i그것이 작동한다는 것 -X POST입니다.


36
허용 된 답변 (HEAD 요청을 수행하는 것)보다 훨씬 낫습니다.
neu242

10
아마도 분명하지만, -i작동 않습니다 어떤 뿐만 아니라, HTTP 방식 GETPOST... :)

3
그것은 머리글과 본문 모두에 컬 출력을 만들어서 스크립트에서 사용될 때 대부분의 작업에 적합하게 만드는 최고의 답변
Sarge Borsch

6
이것은 최선의 대답이며,와 함께 사용할 수 있습니다 -s(진행률 표시기 또는 오류 메시지를 표시하지 않는 것) -S(결국 오류 메시지 표시를 할)
조나단 하틀리을

69

변수에서 HTTP 상태 코드를 캡처하고 여전히 컨텐츠를 STDOUT으로 경로 재 지정하려면 두 개의 STDOUT을 작성해야합니다. 프로세스 대체> ()명령 대체 $ ()로이를 수행 할 수 있습니다 .

먼저로 3현재 프로세스의 STDOUT에 대한 파일 디스크립터 를 작성 하십시오 exec 3>&1.

그런 다음 curl의 -o옵션을 사용하여 명령 대체를 사용하여 응답 내용을 임시 fifo로 리디렉션 한 다음 해당 명령 대체 내에서을 사용하여 현재 프로세스 STDOUT 파일 디스크립터 3로 출력을 다시 리디렉션하십시오 -o >(cat >&3).

모든 것을 종합하면 bash 3.2.57(1)-release(의 표준 macOS) :

# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1 
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')

이에서 작동하지 않습니다 /bin/sh으로 SamK 아래 코멘트에 주목 .


5
그것은 심각한 칙칙한 ... 그리고 나는 그것을 좋아한다!
spyle

3
이제 어떻게 출력을 다른 변수로 리디렉션 할 수 있습니까?
Roger Filmyer

1
출력은에 STDOUT있으므로 일반 명령처럼 원하는 위치로 명령의 출력을 리디렉션 할 수 있어야합니다. 나는 이것을 테스트하지 않았다.
히스 국경

1
/ bin / sh에서는 작동하지 않습니다.
SamK

좋은 대답은, 쉘의 이식성을 원한다면 실제 파일로 리디렉션하고 나중에
캐터링

32

컬 출력 재정의 :

curl -sw '%{http_code}' http://example.org

모든 요청 유형과 함께 사용할 수 있습니다.


-k (-안전하지 않음)가 -s (자동)보다 우선합니다.
Ravichandra

16

상태 코드

[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200

GIST에 대한 모든 크레딧


11

이것은 고통스러운 curl --fail한계입니다. 보낸 사람 man curl:

-f, --fail (HTTP) 서버 오류시 자동으로 실패 (출력 없음)

그러나 0이 아닌 리턴 코드 stdout에서 응답 본문을 모두 얻는 방법은 없습니다 .

pvandenberk 의 답변과 SO 에서 배운 다른 유용한 트릭을 기반으로 다음과 같은 해결 방법이 있습니다.

curl_with_error_code () {
    _curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
    local curl_error_code http_code
    exec 17>&1
    http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
    curl_error_code=$?
    exec 17>&-
    if [ $curl_error_code -ne 0 ]; then
        return $curl_error_code
    fi
    if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
        echo "HTTP $http_code" >&2
        return 127
    fi
}

이 함수는와 정확히 동일하게 작동 curl하지만 curl[400, 600 [.


동의, 오류 출력을 볼 수 없다는 것은 매우 편리한 실패의 고통스러운 한계입니다. 오류 출력을 보지 않고 REST API 실패를 어떻게 진단 할 수 있습니까? 컬 유지 관리자 배거가 완고하게 실패하지만 쇼 오류를 제공하지 말 것을 주장하는 것은 불행한 일입니다. github.com/curl/curl/issues/1978
jamshid

설명서에 명시된 바와 같이 401 및 407 HTTP 코드에서는 작동하지 않습니다. (
Logan Mzz

11

이것은 URL에 요청을 보내고 응답의 첫 번째 줄만 가져 와서 블록으로 나누고 두 번째 줄을 선택합니다.

응답 코드를 포함합니다

curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2

1
이 코드의 기능과 OP가 제공 한 문제를 어떻게 해결하는지 설명 할 수 있습니까? 설명 할 수없는 코드는 신뢰할 수없고 사용자에게 위험 할 수 있습니다.
bwDraco

1
물론, 우리는 URL에 요청을 보내고 응답의 첫 번째 줄만 가져 와서 블록으로 나누고 두 번째 줄을 선택하십시오. OP가 찾고있는 응답 코드를 포함합니다.
Filip Spiridonov

9

POST 요청의 경우 다음이 작동했습니다.

curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o  'RESP_CODE:[1-4][0-9][0-9]'

6

다음 cURL 명령을 사용하여 grep으로 파이프하십시오.

$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP / 1.1"

각 플래그의 기능은 다음과 같습니다.

  • -I: 응답 헤더 만 표시
  • -s: 무음-진행률 표시 줄 표시 안 함
  • -L: Location:헤더 따르기

다음은 HTTP 상태 코드에 대한 링크 입니다.

명령 행에서 실행하십시오. 이 컬은 자동 모드로 실행되며 리디렉션을 따르고 HTTP 헤더를 가져옵니다. grep은 HTTP 상태 코드를 표준 출력으로 인쇄합니다.


5
curl -so -i /dev/null -w "%{http_code}"  http://www.any_example.com

다음 정보가 반환됩니다.

  1. 오류와 같은 API에 의해 데이터가 반환되는 경우 응답 데이터
  2. 상태 코드

이것은 리디렉션을 따르지 않습니다. 이 기존 답변이 더 좋습니다 superuser.com/a/442395/475508
cricket_007

물론, 당신도 그것을 참조 할 수 있습니다!
srana

4

다음은 사용 GET하고 있으며 HTTP 코드를 반환하는 curl 명령입니다 .

curl -so /dev/null -w '%{response_code}' http://www.example.org

아래의 접근 방식은을 사용 HEAD하고 있습니다.이 방법 은 더 빠르지 만 일부 웹 비 호환 HTTP 서버에서는 제대로 작동하지 않을 수 있습니다.

 curl -I http://www.example.org

적어도 OS X에서는 작동하지 않습니다.
Ain

OS X High Sierra 10.13.6에서 잘 작동합니다.
벤 바론

4

응답 코드를 사용하는 방법의 예입니다. Geolite 데이터베이스를 변경 ( -z)하고 리디렉션 ( -L)을 수행 한 경우에만이를 사용하여 Geolite 데이터베이스를 다시 다운로드합니다 .

url=http://example.com/file.gz
file=$(basename $url)

response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")

case "$response" in
        200) do_something ;;
        301) do_something ;;
        304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
        404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
          *) printf "Received: HTTP $response ==> $url\n" ;;
esac

3

OP는 상태 코드를 알고 싶어합니다. 파일을 다운로드 할 때 종종 크기를 느끼고 싶기 때문에 curl을 사용하여 상태 코드와 파일 크기를 표시 한 다음 자세한 장소와 이름으로 원하는 파일을 직접 닫습니다.

curl -R -s -S -w  "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html

그런 다음 컬의 마무리를 기다립니다

wait ${!}

다음 명령을 실행하기 전에 위와 같은 많은 명령의 스크립트에서 사용될 때 위와 같은 좋은 반응을 얻습니다.

http : 200 42824

http : 200 34728

http : 200 35452

curl에서 -o 뒤에는 파일의 전체 경로 + 파일 이름이 와야합니다. 따라서 컬을 사용하여 파일을 d / l 할 때 적절한 이름 구조로 파일을 저장할 수 있습니다. 또한 -s와 -S를 함께 사용하면 출력이 침묵되지만 오류가 표시됩니다. 또한 -R은 파일 타임 스탬프를 웹 파일의 타임 스탬프로 설정하려고합니다.

내 대답은 @pvandenberk가 원래 제안한 내용을 기반으로하지만 실제로는 / dev / null로 지정하는 대신 실제로 파일을 어딘가에 저장합니다.


1

출력 컨텐츠 stdout와 HTTP 상태 코드를 stderr다음으로 분할하십시오 .

curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

stderr에 HTTP 상태 코드 만 필요한 경우 다음을 --silent사용할 수 있습니다.

curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2

그런 다음 원하지 않는 스트림을 다음으로 리디렉션하여 원하는 스트림을 선택할 수 있습니다 /dev/null.

$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...

참고 두 번째 리디렉션 등 원하는 행동을 위해, 우리는 서브 쉘에서 curl 명령을 실행해야.


1
bash프로세스 대체가 필요합니다 .
Jaakko

@Bruno, 파일을 병렬로 실행하면 예기치 않은 결과가 발생할 수 있다고 생각하므로 superuser.com/revisions/1444693/2 에서 예제를 변경했습니다 /tmp/out /tmp/err.
Jaakko는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.