Як відобразити заголовки запитів із завитками командного рядка


567

Згортання командного рядка може відображати заголовок відповіді за допомогою -Dпараметра, але я хочу побачити, який заголовок запиту він надсилає. Як я можу це зробити?


28
curl --head http://google.comзробимо так само, як -Iпрапор :)
Абель Терефе

9
Примітка щодо використання --head/ -I: не всі сервери відповідають однаково однаково на HEADзапити (наприклад, Content-Encodingбракувало б, якщо ви намагалися перевірити, чи буде тіло gzipped), і не всі сервери підтримують HEAD. -vзазвичай безпечніший вибір.
cfeduke

Відповіді:


751

curl's -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

Популярний відповідь для відображення відповідей заголовків, але ОП запитав про запиті заголовках.

curl -s -D - -o /dev/null http://example.com
  • -s : Уникайте показу панелі прогресу
  • -D -: Скидає заголовки у файл, але -надсилає їх до stdout
  • -o /dev/null : Ігноруйте орган реакції

Це краще, -Iоскільки він не надсилає HEADзапит, який може давати різні результати.

Це краще, ніж -vтому, що вам не потрібно стільки хаків, щоб розкрити їх.


17
Прочитайте питання - це для того, щоб заголовки відповідей не вимагали заголовків
Graeme Stuart

57
Ця відповідь мені корисна, оскільки я також неправильно прочитав питання.
Ліам

2
Ця команда трохи відрізняється для Windows: curl -sD - -o NULL http://example.com
Сергій Власов,

2
@SergeyVlasov Власне, еквівалент /dev/nullв Windows є nul, ні null.
Франциско Зарабобозо

2
Незважаючи на те, що це запитання вимагає заголовків запитів, google спрямовує всіх, хто шукає заголовки відповідей, тому ми всі раді, що відповідь є тут. І ця відповідь найкраща для отримання заголовків відповідей. Дякую!!!
біомікер

96

Я вважаю, що перемикач командного рядка, який ви шукаєте для переходу до скручування, є -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

38
-IВаріант показує відповідь заголовки. Питання стосувалося заголовків запитів.
Асаф

53
В -Iопції причини згорнутися сделат HTTP HEAD, який може змінити відповідь від сервера. Краще використовувати -vперемикач, я вважаю.
acw

1
Якщо ви спробуєте це з чим-небудь іншим, крім HEADзапиту (як -X POST), і отримаєте "Ви можете вибрати лише один запит HTTP!" ніж stackoverflow.com/questions/286982/… , ймовірно, допоможе вам. Справа в тому , що -Iробить HEADзапит, як acwзазначено , і коли ваш curlзаклик встановити , щоб зробити ще один дзвінок у вас є два HTTP - запитів в curlвиклику ...
грип

7
Це дуже неправильна відповідь. (Обіцяю, що тут я дуже добрий.) 1. Це робить навпаки того, що просить ОП. 2. Він використовує метод запиту HEADзамість GETабо POST. 3. НІКОЛИ не слід використовувати "просто бачити заголовки", якщо ви не намагаєтесь побачити, як ваш сервер реагує по-іншому на a, HEADа не на a GET. Це буде те саме більшу частину часу, але не завжди. Щоб бачити лише заголовки curl -o /dev/null -D /dev/stdout. Це дасть очікувані результати 100% часу.
Бруно Броноський

79

Додатковий варіант зручний, але якщо ви хочете побачити все, що робиться згортання (включаючи тіло HTTP, яке передається, а не лише заголовки), пропоную скористатися одним із наведених нижче варіантів:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # файл

Я не думаю, як це показує заголовки відповідей та тіло теж!
Пмпр

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настане кінець.
крик

12

Команда, подібна до наведеної нижче, покаже три розділи: заголовки запитів, заголовки відповідей та дані (розділені CRLF). Це дозволяє уникнути технічної інформації та синтаксичного шуму, доданого curl.

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 - редагуйте відповідь, отриману завитком, використовуючи команди нижче
  • /^* /d - видалити рядки, починаючи з "*" (технічна інформація)
  • /bytes data]$/d - видалити рядки, що закінчуються на "байтові дані]" (технічна інформація)
  • s/> // - видалити префікс '>'
  • s/< // - видалити префікс '<'

7

Мені довелося самостійно подолати цю проблему під час налагодження веб-додатків. -vчудово, але трохи занадто багатослівно на мій смак. Це (тільки для удару) рішення, яке я придумав:

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

Це працює, тому що вихідний сигнал -vвідсилається до stderr, а не до stdout. Перенаправляючи це на підшару, ми можемо sedїї видалити рядки, що починаються з *. Оскільки реальний вихід не проходить через допоміжну оболонку, це не впливає. Використання підзарядки - це трохи важко, але це найпростіший спосіб перенаправити stderr до іншої команди. (Як я зазначав, я використовую це лише для тестування, тому він добре працює для мене.)


4

опція -v для curl занадто багатослівна у виведенні помилки, яка містить провідне *(рядок стану) або >(поле заголовка запиту) або <(поле заголовка відповіді). щоб отримати лише головне поле запиту:

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

Якщо ви хочете отримати більше альтернатив, ви можете спробувати встановити HTTP-клієнт сучасного командного рядка на зразок httpie, який доступний для більшості операційних систем з такими менеджерами пакетів, як brew, apt-get, pip, yum тощо

наприклад: - Для OSX

brew install httpie

Потім ви можете використовувати його в командному рядку з різними параметрами

http GET https://www.google.com

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.