So zeigen Sie Anforderungsheader mit Befehlszeilen-Curl an

567

Befehlszeilen-Curl kann den Antwortheader mithilfe der -DOption anzeigen , aber ich möchte sehen, welcher Anforderungsheader gesendet wird. Wie kann ich das machen?

wwwxml
quelle
28
curl --head http://google.comwird das gleiche tun wie die -IFlagge :)
Abel Terefe
9
Hinweis zur Verwendung von --head/ -I: Nicht alle Server reagieren genau gleich auf HEADAnforderungen ( Content-Encodingwürde beispielsweise fehlen, wenn Sie versuchen würden, zu überprüfen, ob der Text komprimiert wird), und nicht alle Server unterstützen HEAD. -vist normalerweise die sicherere Wahl.
cfeduke

Antworten:

751

curls -voder --verboseOption zeigt unter anderem die HTTP-Anforderungsheader an. Hier ist eine Beispielausgabe:

$ 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
Asaph
quelle
6
Was ist, wenn ich das Paket nur erstellen, aber nicht senden möchte?
PuercoPop
@jacobsimeon Ich denke, das liegt daran, dass nicht nur die Request-Header, sondern auch die Response-Header und der Response-Body angezeigt werden .
Pmpr
234

Eine beliebte Antwort für die Anzeige Antwort - Header, aber OP fragte nach Anfrage - Header.

curl -s -D - -o /dev/null http://example.com
  • -s : Vermeiden Sie es, den Fortschrittsbalken anzuzeigen
  • -D -: Header in eine Datei -kopieren , aber an stdout senden
  • -o /dev/null : Antwortkörper ignorieren

Dies ist besser, als -Ikeine HEADAnfrage zu senden , was zu unterschiedlichen Ergebnissen führen kann.

Es ist besser als -vweil du nicht so viele Hacks brauchst, um es zu lösen.

JaffaTheCake
quelle
17
Lesen Sie die Frage - dies ist für Antwortheader, nicht für Anforderungsheader
Graeme Stuart
57
Diese Antwort ist nützlich für mich, weil ich die Frage auch falsch verstanden habe.
Liam
2
Dieser Befehl ist etwas anders für Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov
2
@SergeyVlasov Eigentlich ist das Äquivalent von /dev/nullin Windows nulnicht null.
Francisco Zarabozo
2
Obwohl diese Frage nach Anforderungsheadern fragt, leitet Google alle hierher, die nach Antwortheadern suchen. Wir sind alle froh, dass diese Antwort hier ist. Und diese Antwort ist die beste, um Antwort-Header zu erhalten. Vielen Dank!!!
Biomiker
96

Ich glaube, der Befehlszeilenschalter, den Sie suchen, um an Curl zu übergeben, ist -I.

Anwendungsbeispiel:

$ 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

Wenn Sie außerdem auf einen HTTP-Statuscode mit der Antwort 301 stoßen, möchten Sie möglicherweise auch einen -LArgumentwechsel übergeben curl, um URL-Weiterleitungen zu folgen, und in diesem Fall die Kopfzeilen aller Seiten (einschließlich der URL-Weiterleitungen) drucken (siehe Abbildung unten) ::

$ 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
evandrix
quelle
38
Die -IOption zeigt die Antwort - Header. Die Frage betraf die Anforderungsheader .
Asaph
53
Die -IOptionen bewirken, dass Curl eine ausführt HTTP HEAD, wodurch die Antwort vom Server geändert werden kann. -vIch glaube, es ist besser, einen Schalter zu verwenden .
Acw
1
Wenn Sie dies mit etwas anderem als einer HEADAnfrage (wie -X POST) versuchen und "Sie können nur eine HTTP-Anfrage auswählen!" als stackoverflow.com/questions/286982/… wird Ihnen wahrscheinlich helfen. Die Sache ist, dass -Ieine HEADAnfrage, wie acwangegeben, ausgeführt wird und wenn Ihr curlAnruf für einen weiteren Anruf eingerichtet ist, haben Sie zwei HTTP-Anfragen im curlAnruf ...
Grippe
7
Dies ist eine sehr falsche Antwort. (Ich verspreche, dass ich hier normalerweise sehr nett bin.) 1. Es macht das Gegenteil von dem, was das OP verlangt. 2. Es wird eine Anforderungsmethode HEADanstelle von GEToder verwendet POST. 3. Es sollte NIEMALS verwendet werden, um "nur die Header zu sehen", es sei denn, Sie versuchen zu sehen, wie Ihr Server anders auf a HEADals auf a reagiert GET. Es wird die meiste Zeit gleich sein, aber nicht immer. Um nur die Header zu sehen, verwenden Sie curl -o /dev/null -D /dev/stdout. Dies führt zu 100% zu den erwarteten Ergebnissen.
Bruno Bronosky
79

Die ausführliche Option ist praktisch, aber wenn Sie alles sehen möchten, was Curl bewirkt (einschließlich des übertragenen HTTP-Körpers und nicht nur der Header), empfehle ich die Verwendung einer der folgenden Optionen:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # Datei
William Denniss
quelle
Ich glaube nicht, da es auch die Antwort-Header und den Body zeigt!
Pmpr
56

Mit dem folgenden Befehl erhalten Sie eine schöne Header-Ausgabe:

 curl -L -v -s -o /dev/null google.de
  • -L, --location Weiterleitungen folgen
  • -v, --verbose Mehr Ausgabe, gibt die Richtung an
  • -s, --silent Zeige keinen Fortschrittsbalken
  • -o, --output /dev/null Empfangenen Körper nicht anzeigen

Oder die kürzere Version:

 curl -Lvso /dev/null google.de

Ergebnisse in:

* 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

Wie Sie sehen können, werden curlsowohl die ausgehenden als auch die eingehenden Header ausgegeben und die Körperdaten übersprungen, obwohl Sie wissen, wie groß der Körper ist.

Zusätzlich wird für jede Zeile die Richtung angegeben, damit sie leicht lesbar ist. Ich fand es besonders nützlich, lange Weiterleitungsketten aufzuspüren.

Benibr
quelle
4
Ich mag das besser als -vOption mit höheren Stimmen. Nur der Kürze halber kann dies auch curl -Lvso /dev/null <target>so lange odauern, bis das Ende erreicht ist.
Schrei
12

Ein Befehl wie der folgende zeigt drei Abschnitte: Anforderungsheader, Antwortheader und Daten (durch CRLF getrennt). Es vermeidet technische Informationen und syntaktisches Rauschen, das durch Curl hinzugefügt wird.

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

Der Befehl erzeugt die folgende Ausgabe:

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>

Beschreibung:

  • -vs - Kopfzeilen hinzufügen (-v), aber Fortschrittsbalken (-s) entfernen
  • 2>&1 - kombinieren Sie stdout und stderr zu einem einzigen stdout
  • sed - Bearbeiten Sie die durch Curl erzeugte Antwort mit den folgenden Befehlen
  • /^* /d - Zeilen entfernen, die mit '*' beginnen (technische Informationen)
  • /bytes data]$/d - Zeilen entfernen, die mit 'Byte-Daten] enden' (technische Informationen)
  • s/> // - Entfernen Sie das Präfix '>'
  • s/< // - Entfernen Sie das Präfix '<'
Igorpcholkin
quelle
7

Ich musste dieses Problem beim Debuggen von Webanwendungen selbst lösen. -vist toll, aber etwas zu ausführlich für meinen Geschmack. Dies ist die (nur Bash) Lösung, die ich mir ausgedacht habe:

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

Dies funktioniert, weil die Ausgabe von -van stderr und nicht an stdout gesendet wird. Indem wir dies auf eine Unterschale umleiten, können wir seddamit Zeilen entfernen, die mit beginnen *. Da die reale Ausgabe die Subshell nicht durchläuft, ist sie nicht betroffen. Die Verwendung einer Subshell ist etwas umständlich, aber es ist der einfachste Weg, stderr zu einem anderen Befehl umzuleiten. (Wie ich bereits erwähnt habe, verwende ich dies nur zum Testen, daher funktioniert es für mich einwandfrei.)

jpfx1342
quelle
4

Die Option -v für Curl ist in der Fehlerausgabe, die die führenden *(Statuszeile) oder >(Anforderungskopffeld) oder <(Antwortkopffeld) enthält, zu ausführlich . um nur das Anforderungskopffeld zu erhalten:

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

um nur das Anforderungskopffeld zu erhalten:

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

oder um es /tmp/test.txtmit der Option -D in eine Datei zu kopieren

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

Um die -vAusgabe zu filtern , sollten Sie die Fehlerausgabe an das Terminal und die Standardausgabe an / dev / null leiten. Die Option -s besteht darin, die Fortschrittsmessung zu verbieten

toolchainX
quelle
1

Wenn Sie weitere Alternativen wünschen, können Sie versuchen, einen modernen Befehlszeilen-HTTP-Client wie httpie zu installieren, der für die meisten Betriebssysteme mit Paketmanagern wie Brew , Apt -Get, Pip, Yum usw. Verfügbar ist

zB: - Für OSX

brew install httpie

Dann können Sie verwenden es auf der Kommandozeile mit verschiedenen Optionen

http GET https://www.google.com

Geben Sie hier die Bildbeschreibung ein

Sudharshan
quelle