Befehlszeilencurl kann Antwortheader mithilfe der Option -D
anzeigen. Ich möchte jedoch sehen, welchen Anforderungsheader er sendet. Wie kann ich das machen?
die Option -v
oder --verbose
von curl zeigt unter anderem die HTTP-Anforderungsheader. 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
curl -sD - -o /dev/null http://example.com
-s
- Vermeiden Sie die Anzeige des Fortschrittsbalkens-D -
- Kopfzeilen in eine Datei ausgeben, aber -
sendet sie an stdout-o /dev/null
- Antworttext ignorierenDies ist besser als -I
, da keine HEAD
-Anforderung gesendet wird, die zu unterschiedlichen Ergebnissen führen kann.
Es ist besser als -v
, weil Sie nicht so viele Hacks brauchen, um das Wort zu verbannen.
Ich glaube, der Befehlszeilenschalter, den Sie suchen, um an curl zu übergeben, ist -I
.
Verwendungsbeispiel:
$ 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 einen Antwort-HTTP-Statuscode 301 erhalten, können Sie auch einen -L
-Argumentwechsel übergeben, um curl
anzuweisen, URL-Weiterleitungen zu folgen, und in diesem Fall die Header aller Seiten (einschließlich der URL-Weiterleitungen) zu drucken unten dargestellt:
$ 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
Die ausführliche Option ist praktisch, aber wenn Sie alles sehen möchten, das curl macht (einschließlich des HTTP-Körpers, der übertragen wird, und nicht nur der Header), empfehle ich die folgenden Optionen:
--trace-ascii -
# stdout--trace-ascii output_file.txt
# dateiSie erhalten eine Nice-Header-Ausgabe mit dem folgenden Befehl:
curl -L -v -s -o /dev/null google.de
-L, --location
Umleitungen folgen-v, --verbose
mehr Ausgabe, gibt die Richtung an-s, --silent
zeigt keinen Fortschrittsbalken an-o, --output /dev/null
zeigt den empfangenen Body nicht anOder 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, gibt curl
sowohl die abgehenden als auch die ankommenden Header aus und überspringt die Bodydaten, obwohl Sie wissen, wie groß der Körper ist.
Zusätzlich wird für jede Zeile die Richtung angegeben, so dass sie gut lesbar ist. Ich fand es besonders nützlich, lange Ketten von Weiterleitungen aufzuspüren.
Dieses Problem musste ich beim Debuggen von Webanwendungen selbst überwinden. -v
ist großartig, aber für meinen Geschmack etwas auch verbose. 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 -v
an stderr und nicht an stdout gesendet wird. Durch Umleiten auf eine Subshell können Sie sed
Zeilen entfernen, die mit *
beginnen. Da die reale Ausgabe die Subshell nicht durchläuft, ist sie nicht betroffen. Die Verwendung einer Subshell ist etwas schwerfällig, aber es ist der einfachste Weg, stderr auf einen anderen Befehl umzuleiten. (Wie ich bereits erwähnt habe, benutze ich das nur zum Testen, also funktioniert es gut für mich.)
die Option -v für curl ist in der Fehlerausgabe zu ausführlich, die den führenden *
(Statuszeile) oder >
(Anforderungskopffeld) oder <
(Antwortkopffeld) enthält. um nur das Feld für den Anforderungskopf zu erhalten:
curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement
um nur das Feld für den Anforderungskopf zu erhalten:
curl -v -sS www.stackoverflow.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement
oder um es mit der Option -D in /tmp/test.txt
-Datei zu speichern
curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null
um die -v
-Ausgabe zu filtern, sollten Sie die Fehlerausgabe an das Terminal und die Standardausgabe an/dev/null weiterleiten. Die Option -s soll die Fortschrittsmessung verbieten
Ein Befehl wie der folgende zeigt drei Abschnitte: Anforderungsheader, Antwortheader und Daten (getrennt durch CRLF). 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
- Header hinzufügen (-v), Fortschrittsbalken entfernen (-s)2>&1
- kombiniere stdout und stderr zu einem einzigen stdoutsed
- Antwort bearbeiten, die von curl mit den folgenden Befehlen erzeugt wird/^* /d
- Zeilen, die mit '*' beginnen, entfernen (technische Info)/bytes data]$/d
- Zeilen entfernen, die mit 'bytes data] enden' (technische Info)s/> //
- Entferne '>' Präfixs/< //
- Entferne das Präfix '<'