명령 행 curl을 사용하여 요청 헤더를 표시하는 방법


567

커맨드 라인 컬은 -D옵션 을 사용하여 응답 헤더를 표시 할 수 있지만 어떤 요청 헤더를 보내고 있는지 알고 싶습니다. 어떻게해야합니까?


28
curl --head http://google.com-I플래그 와 같은 작업을 수행합니다 :)
Abel Terefe

9
--head/ -I: 사용에 대한 참고 사항 모든 서버가 HEAD요청 에 정확히 동일한 응답을하는 것은 아닙니다 (예를 들어, Content-Encoding본문이 압축되었는지 확인하려는 경우 누락 됨) HEAD. 모든 서버가 지원하지는 않습니다 . -v일반적으로 더 안전한 선택입니다.
cfeduke

답변:


751

curl -v또는 --verbose옵션은 무엇보다도 HTTP 요청 헤더를 보여줍니다. 다음은 몇 가지 샘플 출력입니다.

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0

6
패키지를 구성하고 싶지만 보내지 않으려면 어떻게해야합니까?
PuercoPop

@jacobsimeon 나는 그것이 요청 헤더 뿐만 아니라 응답 헤더응답 본문을 보여주기 때문이라고 생각합니다 .
Pmpr

234

응답 헤더 를 표시하는 데 가장 많이 사용되는 답변 이지만 OP는 요청 헤더 에 대해 질문했습니다 .

curl -s -D - -o /dev/null http://example.com
  • -s : 진행률 표시 줄 표시 안 함
  • -D -: 헤더를 파일로 덤프하지만 -stdout으로 보냅니다.
  • -o /dev/null : 응답 본문 무시

요청을 -I보내지 않고 HEAD다른 결과를 얻을 수 있는 것보다 낫습니다 .

-v자세한 정보를 얻기 위해 많은 핵을 필요로하지 않기 때문에 보다 낫 습니다.


17
질문을 읽으십시오-이것은 헤더를 요청하지 않는 응답 헤더에 대한 것입니다
Graeme Stuart

57
이 답변은 질문을 잘못 읽었 기 때문에 나에게 유용합니다.
Liam

2
이 명령은 Windows에서 약간 다릅니다. curl -sD - -o NULL http://example.com
Sergey Vlasov

2
@SergeyVlasov 실제로 /dev/nullWindows 에서와 동등한 것은 nul아닙니다 null.
Francisco Zarabozo

2
이 질문에 요청 헤더가 필요하지만 Google은 응답 헤더를 찾는 모든 사람을 여기에서 지시 하므로이 답변이 여기에 있습니다. 그리고이 답변은 응답 헤더를 얻는 데 가장 좋습니다. 감사!!!
biomiker

96

curl에 전달하려는 명령 줄 스위치는 -I입니다.

사용법 예 :

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

또한 응답 HTTP 상태 코드 301이 발생하면 -L인수 전환을 전달하여 curlURL 리디렉션을 따르도록 지시 할 수 있으며,이 경우 아래 그림과 같이 URL 리디렉션을 포함한 모든 페이지의 헤더를 인쇄하십시오. :

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html

38
-I옵션을 보여줍니다 응답 헤더를. 질문은 요청 헤더 에 관한 것 입니다.
Asaph

53
-I옵션을 사용하면 curl에서을 수행 HTTP HEAD하여 서버의 응답을 변경할 수 있습니다. -v내가 믿는 스위치 를 사용하는 것이 좋습니다.
acw

1
HEAD요청 이외의 다른 방법으로 시도 -X POST하면 "하나의 HTTP 요청 만 선택할 수 있습니다!" stackoverflow.com/questions/286982/… 보다 도움이 될 것입니다. 문제는 즉 -I않습니다 HEAD같은 요청을 acw언급하고 때 curl통화가 다른 통화를 할 수 있도록 설정 당신이 두 개의 HTTP 요청이 curl... 전화
독감

7
이것은 매우 잘못된 대답입니다. (저는 보통 여기서 매우 친절하다고 약속합니다.) 1. OP가 요구하는 것과 반대입니다. 2. 또는 HEAD대신 요청 방법을 사용합니다 . 3. 서버가에 대한 것과 다르게 응답하는 방식을 보려고하지 않는 한 "헤더 만 확인"하는 데 사용해서는 안됩니다 . 대부분 같은 시간이지만 항상 그런 것은 아닙니다. 헤더 만 보려면을 사용하십시오 . 예상 결과에 100 %의 시간이 제공됩니다. GETPOSTHEADGETcurl -o /dev/null -D /dev/stdout
Bruno Bronosky

79

verbose 옵션은 편리하지만 curl이 수행하는 모든 내용 (헤더뿐만 아니라 전송 된 HTTP 본문 포함) 을 보려면 아래 옵션 중 하나를 사용하는 것이 좋습니다.

  • --trace-ascii - # 표준 출력
  • --trace-ascii output_file.txt # 파일

응답 헤더 및 본문도 표시하므로 생각하지 않습니다!
Pmpr

56

다음 명령으로 멋진 헤더 출력을 얻습니다.

 curl -L -v -s -o /dev/null google.de
  • -L, --location 리디렉션을 따르십시오
  • -v, --verbose 더 많은 출력, 방향을 나타냅니다
  • -s, --silent 진행률 표시 줄을 표시하지 않습니다
  • -o, --output /dev/null 받은 본문을 표시하지 않음

또는 더 짧은 버전 :

 curl -Lvso /dev/null google.de

결과 :

* Rebuilt URL to: google.de/
*   Trying 2a00:1450:4008:802::2003...
* Connected to google.de (2a00:1450:4008:802::2003) port 80 (#0)
> GET / HTTP/1.1
> Host: google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15:45:36 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
<
* Ignoring the response-body
{ [218 bytes data]
* Connection #0 to host google.de left intact
* Issue another request to this URL: 'http://www.google.de/'
*   Trying 2a00:1450:4008:800::2003...
* Connected to www.google.de (2a00:1450:4008:800::2003) port 80 (#1)
> GET / HTTP/1.1
> Host: www.google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat, 11-Feb-2017 15:45:36 GMT; path=/; domain=.google.de; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
{ [11080 bytes data]
* Connection #1 to host www.google.de left intact

보시다시피 curl발신 및 수신 헤더 모두의 출력 을 볼 수 있으며 본문이 얼마나 큰지 알려주지 않아도 본문 데이터를 건너 뜁니다.

또한 모든 줄에 대해 읽기 쉬운 방향이 표시됩니다. 긴 리디렉션 체인을 추적하는 것이 특히 유용하다는 것을 알았습니다.


4
나는 더 -v높은 투표를 가진 옵션 보다 이것을 좋아 합니다. 또한, 간결성을 위해 이것은 끝 curl -Lvso /dev/null <target>o오는 한 길 수도 있습니다 .
shriek

12

아래와 같은 명령은 요청 헤더, 응답 헤더 및 데이터 (CRLF로 구분)의 세 섹션으로 표시됩니다. 컬에 의해 추가 된 기술 정보 및 구문 노이즈를 피합니다.

curl -vs www.stackoverflow.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

이 명령은 다음과 같은 출력을 생성합니다.

GET / HTTP/1.1
Host: www.stackoverflow.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://stackoverflow.com/">here</a></body>

기술:

  • -vs -헤더를 추가하지만 (-v) 진행률 표시 줄을 제거합니다 (-s)
  • 2>&1 -stdout과 stderr을 단일 stdout으로 결합
  • sed -아래 명령을 사용하여 curl로 생성 된 응답 편집
  • /^* /d - '*'(기술 정보)로 시작하는 줄을 제거하십시오.
  • /bytes data]$/d - 'bytes data]'(기술 정보)로 끝나는 줄 제거
  • s/> // - '>'접두사 제거
  • s/< // - '<'접두사 제거

7

웹 응용 프로그램을 디버깅 할 때이 문제를 직접 극복해야했습니다. -v대단하지만 내 취향으로는 너무 장황하다. 이것은 내가 생각해 낸 (bash 전용) 솔루션입니다.

curl -v http://example.com/ 2> >(sed '/^*/d')

의 출력은 -vstdout이 아닌 stderr로 전송 되기 때문에 작동합니다 . 이것을 서브 쉘로 재 지정함으로써로 sed시작하는 행을 제거 할 수 있습니다 *. 실제 출력은 서브 쉘을 통과하지 않으므로 영향을받지 않습니다. 서브 쉘을 사용하는 것은 약간 어렵지만 stderr를 다른 명령으로 리디렉션하는 가장 쉬운 방법입니다. (알다시피, 나는 이것을 테스트에만 사용하고 있으므로 나에게 잘 작동합니다.)


4

curl의 -v 옵션은 선행 *(상태 라인) 또는 >(요청 헤드 필드) 또는 <(응답 헤드 필드) 를 포함하는 오류 출력에서 ​​너무 자세합니다 . 요청 헤드 필드 만 가져 오려면 :

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

요청 헤드 필드 만 가져 오려면 :

curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

또는 /tmp/test.txt-D 옵션을 사용하여 파일 로 덤프

curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null

-v출력 을 필터링하려면 오류 출력을 터미널로 보내고 std 출력을 / dev / null로 보내야합니다. -s 옵션은 진행 측정을 금지합니다.


1

더 많은 대안을 원한다면 brew, apt-get, pip, yum 등과 같은 패키지 관리자로 대부분의 운영 체제에서 사용할 수있는 httpie 와 같은 최신 명령 행 HTTP 클라이언트를 설치할 수 있습니다

예 :-OSX의 경우

brew install httpie

그런 다음 다양한 옵션으로 명령 행에서 사용할 수 있습니다

http GET https://www.google.com

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.