Làm thế nào để hiển thị các tiêu đề yêu cầu với curl dòng lệnh


567

Curl dòng lệnh có thể hiển thị tiêu đề phản hồi bằng cách sử dụng -Dtùy chọn, nhưng tôi muốn xem tiêu đề yêu cầu mà nó đang gửi. Làm thế nào tôi có thể làm điều đó?


28
curl --head http://google.comsẽ làm giống như -Icờ :)
Abel Terefe

9
Lưu ý khi sử dụng --head/ -I: không phải tất cả các máy chủ đều phản hồi giống hệt với HEADcác yêu cầu (ví dụ: Content-Encodingsẽ bị thiếu nếu bạn đang cố xác minh rằng phần thân sẽ được nén) và không phải tất cả các máy chủ đều hỗ trợ HEAD. -vthường là sự lựa chọn an toàn hơn.
cfeduke

Câu trả lời:


751

curl's -vhoặc --verbosetùy chọn hiển thị các tiêu đề yêu cầu HTTP, trong số những thứ khác. Đây là một số đầu ra mẫu:

$ 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
Điều gì xảy ra nếu tôi chỉ muốn xây dựng gói nhưng không muốn gửi nó?
PuercoPop

@jacobsimeon Tôi nghĩ đó là bởi vì nó không chỉ hiển thị các tiêu đề Yêu cầu mà còn cả các tiêu đề Phản hồicơ quan Phản hồi .
Pmpr

234

Một câu trả lời phổ biến để hiển thị các tiêu đề phản hồi , nhưng OP đã hỏi về các tiêu đề yêu cầu .

curl -s -D - -o /dev/null http://example.com
  • -s : Tránh hiển thị thanh tiến trình
  • -D -: Dump tiêu đề vào một tệp, nhưng -gửi nó đến thiết bị xuất chuẩn
  • -o /dev/null : Bỏ qua cơ thể phản ứng

Điều này tốt hơn -Ilà nó không gửi HEADyêu cầu, có thể tạo ra kết quả khác nhau.

Tốt hơn là -vvì bạn không cần quá nhiều hack để giải phóng nó.


17
Đọc câu hỏi - đây là cho tiêu đề phản hồi không yêu cầu tiêu đề
Graeme Stuart

57
Câu trả lời này hữu ích cho tôi vì tôi cũng đọc sai câu hỏi.
Liam

2
Lệnh này hơi khác một chút đối với Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov

2
@SergeyVlasov Trên thực tế, tương đương với /dev/nulltrong Windows là nulkhông null.
Francisco Zarabozo

2
Mặc dù câu hỏi này yêu cầu các tiêu đề yêu cầu, google đang hướng mọi người ở đây đang tìm kiếm các tiêu đề phản hồi vì vậy chúng tôi rất vui vì câu trả lời này có ở đây. Và câu trả lời này là tốt nhất để có được tiêu đề phản hồi. Cảm ơn!!!
sinh viên

96

Tôi tin rằng chuyển đổi dòng lệnh bạn đang tìm kiếm để vượt qua để curl là -I.

Ví dụ sử dụng:

$ 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

Ngoài ra, nếu bạn gặp mã trạng thái HTTP phản hồi là 301, bạn cũng có thể chuyển một -Lcông tắc đối số để yêu curlcầu theo dõi chuyển hướng URL và trong trường hợp này, in các tiêu đề của tất cả các trang (bao gồm cả chuyển hướng URL), được minh họa bên dưới :

$ 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
Các -Itùy chọn cho thấy phản ứng tiêu đề. Câu hỏi là về các tiêu đề yêu cầu .
Asaph

53
Các -Itùy chọn khiến curl thực hiện một thao HTTP HEADtác có thể thay đổi phản hồi từ máy chủ. Tốt hơn để sử dụng -vchuyển đổi tôi tin.
acw

1
Nếu bạn thử điều này với bất kỳ điều gì khác ngoài một HEADyêu cầu (như -X POST) và nhận được "Bạn chỉ có thể chọn một yêu cầu HTTP!" hơn stackoverflow.com/questions/286982/ có thể sẽ giúp bạn ra ngoài. Vấn đề là đó là -Imột HEADyêu cầu, như acwđã nêu và khi curlcuộc gọi của bạn được thiết lập để thực hiện một cuộc gọi khác, bạn có hai yêu cầu HTTP trong curlcuộc gọi ...
cúm

7
Đây là một câu trả lời rất sai. (Tôi hứa rằng tôi thường rất tử tế ở đây.) 1. Nó trái ngược với những gì OP yêu cầu. 2. Nó sử dụng một phương thức yêu cầu HEADthay vì GEThoặc POST. 3. KHÔNG BAO GIỜ được sử dụng để "chỉ nhìn thấy các tiêu đề" trừ khi bạn đang cố gắng xem máy chủ của bạn phản ứng khác nhau HEADnhư thế nào so với a GET. Nó sẽ giống nhau hầu hết thời gian, nhưng không phải lúc nào cũng vậy. Để chỉ xem các tiêu đề sử dụng curl -o /dev/null -D /dev/stdout. Điều đó sẽ cho kết quả mong đợi 100% thời gian.
Bruno Bronosky

79

Tùy chọn verbose rất tiện dụng, nhưng nếu bạn muốn xem mọi thứ mà curl làm (bao gồm cả phần thân HTTP được truyền đi, và không chỉ các tiêu đề), tôi khuyên bạn nên sử dụng một trong các tùy chọn bên dưới:

  • --trace-ascii - # xuất sắc
  • --trace-ascii output_file.txt # tập tin

Tôi không nghĩ như vậy vì nó cũng hiển thị các tiêu đề và cơ thể phản hồi!
Pmpr

56

Bạn nhận được một đầu ra tiêu đề đẹp với lệnh sau:

 curl -L -v -s -o /dev/null google.de
  • -L, --location theo chuyển hướng
  • -v, --verbose đầu ra nhiều hơn, chỉ ra hướng
  • -s, --silent không hiển thị thanh tiến trình
  • -o, --output /dev/null không hiển thị cơ thể nhận được

Hoặc phiên bản ngắn hơn:

 curl -Lvso /dev/null google.de

Kết quả trong:

* 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

Như bạn có thể thấy curlđầu ra cả tiêu đề đi và tiêu đề đến và bỏ qua bodydata mặc dù cho bạn biết cơ thể lớn như thế nào.

Ngoài ra, đối với mỗi dòng, hướng được chỉ định để dễ đọc. Tôi thấy nó đặc biệt hữu ích để theo dõi các chuỗi chuyển hướng dài.


4
Tôi thích điều này tốt hơn -vtùy chọn với số phiếu cao hơn. Ngoài ra, chỉ để cho ngắn gọn, điều này cũng có thể curl -Lvso /dev/null <target>miễn là ođến cuối cùng.
hét

12

Một lệnh như bên dưới sẽ hiển thị ba phần: tiêu đề yêu cầu, tiêu đề phản hồi và dữ liệu (được phân tách bằng CRLF). Nó tránh thông tin kỹ thuật và tiếng ồn cú pháp được thêm vào bởi curl.

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

Lệnh sẽ tạo đầu ra sau:

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>

Sự miêu tả:

  • -vs - thêm tiêu đề (-v) nhưng xóa thanh tiến trình (-s)
  • 2>&1 - kết hợp thiết bị xuất chuẩn và thiết bị xuất chuẩn thành thiết bị xuất chuẩn duy nhất
  • sed - chỉnh sửa phản hồi được tạo bởi curl bằng các lệnh bên dưới
  • /^* /d - xóa các dòng bắt đầu bằng '*' (thông tin kỹ thuật)
  • /bytes data]$/d - xóa các dòng kết thúc bằng 'byte data]' (thông tin kỹ thuật)
  • s/> // - xóa tiền tố '>'
  • s/< // - xóa tiền tố '<'

7

Tôi đã phải tự khắc phục vấn đề này khi gỡ lỗi các ứng dụng web. -vlà tuyệt vời, nhưng một chút quá dài cho thị hiếu của tôi. Đây là giải pháp (chỉ dành cho bash) mà tôi đã đưa ra:

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

Điều này hoạt động vì đầu ra từ -vđược gửi đến thiết bị xuất chuẩn, không phải thiết bị xuất chuẩn. Bằng cách chuyển hướng này đến một mạng con, chúng ta có thể sedloại bỏ các dòng bắt đầu bằng *. Vì đầu ra thực không đi qua lớp con nên nó không bị ảnh hưởng. Sử dụng một subshell là một chút nặng tay, nhưng đó là cách dễ nhất để chuyển hướng stderr sang một lệnh khác. (Như tôi đã lưu ý, tôi chỉ sử dụng cái này để thử nghiệm, vì vậy nó hoạt động tốt với tôi.)


4

tùy chọn -v cho curl quá dài dòng trong đầu ra lỗi có chứa hàng đầu *(dòng trạng thái) hoặc >(trường đầu yêu cầu) hoặc <(trường đầu phản hồi). để chỉ nhận trường đầu yêu cầu:

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

để chỉ nhận trường đầu yêu cầu:

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

hoặc để đổ nó vào /tmp/test.txttập tin với tùy chọn -D

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

Để lọc -vđầu ra, bạn nên hướng đầu ra lỗi tới terminal và đầu ra std thành / dev / null, tùy chọn -s là cấm đo lường tiến trình


1

Nếu bạn muốn có nhiều lựa chọn thay thế, Bạn có thể thử cài đặt máy khách HTTP dòng lệnh hiện đại như httpie , có sẵn cho hầu hết các Hệ điều hành với các trình quản lý gói như brew, apt-get, pip, yum, v.v.

ví dụ: - Dành cho OSX

brew install httpie

Sau đó, bạn có thể sử dụng nó trên dòng lệnh với các tùy chọn khác nhau

http GET https://www.google.com

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.