내가 사용하고 curl
HTTP 요청을 발행 할 리눅스 명령 줄에서. 응답 본문은 표준 출력으로 인쇄되지만 문제는 매뉴얼 페이지에서 응답 (404, 403 등)에서 HTTP 상태 코드를 인쇄하기 위해 컬을 얻는 방법을 알 수 없습니다. 이게 가능해?
curl -IL http://www.example.com | grep "^HTTP\/"
?
내가 사용하고 curl
HTTP 요청을 발행 할 리눅스 명령 줄에서. 응답 본문은 표준 출력으로 인쇄되지만 문제는 매뉴얼 페이지에서 응답 (404, 403 등)에서 HTTP 상태 코드를 인쇄하기 위해 컬을 얻는 방법을 알 수 없습니다. 이게 가능해?
curl -IL http://www.example.com | grep "^HTTP\/"
?
답변:
웹 서버가 HEAD 요청에 응답 할 수있는 경우 작동 합니다 (을 수행하지 않음 GET
).
curl -I http://www.example.org
또한 cURL이 리디렉션 (3xx 상태)을 따르도록하려면 -L을 추가하십시오.
curl -I
일부 웹 응용 프로그램 서버 및 서비스에 대한 HTTP 상태 코드를 테스트하는 데 문제가 될 수있는 HEAD HTTP 요청을 수행합니다.
head -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
. 리디렉션 후 최종 상태가 필요한 경우 컬하려면 -L을 추가하십시오.
curl -I -X GET
GET 요청을 보내지 만 동일한 출력을 제공합니다.
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/
/dev/null
내가 사용하는 Windows 버전의 curl에서도 작동합니다.
httping -c 1 -s -G -m
이 질문이 컬에 관한 것임을 알고 있지만 GET을 발행하고 전체 파일을 다운로드하지는 않습니다.
-s
= 다운로드 진행률 -o /dev/null
표시 안 함, -w "%{http_code}"
= 본문 표시 안함 , = 종료 후 http 응답 코드를 stdout에 씁니다.
결과뿐만 아니라 헤더를 보려면 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
다음을 수행하여 모든 헤더 외에 상태 코드를 인쇄 할 수 있습니다.
curl -i http://example.org
좋은 점은 -i
그것이 작동한다는 것 -X POST
입니다.
-i
작동 않습니다 어떤 뿐만 아니라, HTTP 방식 GET
과 POST
... :)
-s
(진행률 표시기 또는 오류 메시지를 표시하지 않는 것) -S
(결국 오류 메시지 표시를 할)
변수에서 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 아래 코멘트에 주목 .
STDOUT
있으므로 일반 명령처럼 원하는 위치로 명령의 출력을 리디렉션 할 수 있어야합니다. 나는 이것을 테스트하지 않았다.
컬 출력 재정의 :
curl -sw '%{http_code}' http://example.org
모든 요청 유형과 함께 사용할 수 있습니다.
이것은 고통스러운 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 [.
이것은 URL에 요청을 보내고 응답의 첫 번째 줄만 가져 와서 블록으로 나누고 두 번째 줄을 선택합니다.
응답 코드를 포함합니다
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
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]'
다음 cURL 명령을 사용하여 grep으로 파이프하십시오.
$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP / 1.1"
각 플래그의 기능은 다음과 같습니다.
-I
: 응답 헤더 만 표시-s
: 무음-진행률 표시 줄 표시 안 함-L
: Location:
헤더 따르기다음은 HTTP 상태 코드에 대한 링크 입니다.
명령 행에서 실행하십시오. 이 컬은 자동 모드로 실행되며 리디렉션을 따르고 HTTP 헤더를 가져옵니다. grep은 HTTP 상태 코드를 표준 출력으로 인쇄합니다.
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
다음 정보가 반환됩니다.
응답 코드를 사용하는 방법의 예입니다. 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
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로 지정하는 대신 실제로 파일을 어딘가에 저장합니다.
출력 컨텐츠 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 명령을 실행해야.
bash
프로세스 대체가 필요합니다 .
/tmp/out
/tmp/err
.