커맨드 라인 컬은 -D
옵션 을 사용하여 응답 헤더를 표시 할 수 있지만 어떤 요청 헤더를 보내고 있는지 알고 싶습니다. 어떻게해야합니까?
--head
/ -I
: 사용에 대한 참고 사항 모든 서버가 HEAD
요청 에 정확히 동일한 응답을하는 것은 아닙니다 (예를 들어, Content-Encoding
본문이 압축되었는지 확인하려는 경우 누락 됨) HEAD
. 모든 서버가 지원하지는 않습니다 . -v
일반적으로 더 안전한 선택입니다.
커맨드 라인 컬은 -D
옵션 을 사용하여 응답 헤더를 표시 할 수 있지만 어떤 요청 헤더를 보내고 있는지 알고 싶습니다. 어떻게해야합니까?
--head
/ -I
: 사용에 대한 참고 사항 모든 서버가 HEAD
요청 에 정확히 동일한 응답을하는 것은 아닙니다 (예를 들어, Content-Encoding
본문이 압축되었는지 확인하려는 경우 누락 됨) HEAD
. 모든 서버가 지원하지는 않습니다 . -v
일반적으로 더 안전한 선택입니다.
답변:
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
응답 헤더 를 표시하는 데 가장 많이 사용되는 답변 이지만 OP는 요청 헤더 에 대해 질문했습니다 .
curl -s -D - -o /dev/null http://example.com
-s
: 진행률 표시 줄 표시 안 함-D -
: 헤더를 파일로 덤프하지만 -
stdout으로 보냅니다.-o /dev/null
: 응답 본문 무시요청을 -I
보내지 않고 HEAD
다른 결과를 얻을 수 있는 것보다 낫습니다 .
더 -v
자세한 정보를 얻기 위해 많은 핵을 필요로하지 않기 때문에 보다 낫 습니다.
curl -sD - -o NULL http://example.com
/dev/null
Windows 에서와 동등한 것은 nul
아닙니다 null
.
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
인수 전환을 전달하여 curl
URL 리디렉션을 따르도록 지시 할 수 있으며,이 경우 아래 그림과 같이 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
-I
옵션을 보여줍니다 응답 헤더를. 질문은 요청 헤더 에 관한 것 입니다.
-I
옵션을 사용하면 curl에서을 수행 HTTP HEAD
하여 서버의 응답을 변경할 수 있습니다. -v
내가 믿는 스위치 를 사용하는 것이 좋습니다.
HEAD
요청 이외의 다른 방법으로 시도 -X POST
하면 "하나의 HTTP 요청 만 선택할 수 있습니다!" stackoverflow.com/questions/286982/… 보다 도움이 될 것입니다. 문제는 즉 -I
않습니다 HEAD
같은 요청을 acw
언급하고 때 curl
통화가 다른 통화를 할 수 있도록 설정 당신이 두 개의 HTTP 요청이 curl
... 전화
HEAD
대신 요청 방법을 사용합니다 . 3. 서버가에 대한 것과 다르게 응답하는 방식을 보려고하지 않는 한 "헤더 만 확인"하는 데 사용해서는 안됩니다 . 대부분 같은 시간이지만 항상 그런 것은 아닙니다. 헤더 만 보려면을 사용하십시오 . 예상 결과에 100 %의 시간이 제공됩니다. GET
POST
HEAD
GET
curl -o /dev/null -D /dev/stdout
다음 명령으로 멋진 헤더 출력을 얻습니다.
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
발신 및 수신 헤더 모두의 출력 을 볼 수 있으며 본문이 얼마나 큰지 알려주지 않아도 본문 데이터를 건너 뜁니다.
또한 모든 줄에 대해 읽기 쉬운 방향이 표시됩니다. 긴 리디렉션 체인을 추적하는 것이 특히 유용하다는 것을 알았습니다.
-v
높은 투표를 가진 옵션 보다 이것을 좋아 합니다. 또한, 간결성을 위해 이것은 끝 curl -Lvso /dev/null <target>
이 o
오는 한 길 수도 있습니다 .
아래와 같은 명령은 요청 헤더, 응답 헤더 및 데이터 (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/< //
- '<'접두사 제거웹 응용 프로그램을 디버깅 할 때이 문제를 직접 극복해야했습니다. -v
대단하지만 내 취향으로는 너무 장황하다. 이것은 내가 생각해 낸 (bash 전용) 솔루션입니다.
curl -v http://example.com/ 2> >(sed '/^*/d')
의 출력은 -v
stdout이 아닌 stderr로 전송 되기 때문에 작동합니다 . 이것을 서브 쉘로 재 지정함으로써로 sed
시작하는 행을 제거 할 수 있습니다 *
. 실제 출력은 서브 쉘을 통과하지 않으므로 영향을받지 않습니다. 서브 쉘을 사용하는 것은 약간 어렵지만 stderr를 다른 명령으로 리디렉션하는 가장 쉬운 방법입니다. (알다시피, 나는 이것을 테스트에만 사용하고 있으므로 나에게 잘 작동합니다.)
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 옵션은 진행 측정을 금지합니다.
curl --head http://google.com
-I
플래그 와 같은 작업을 수행합니다 :)