Come visualizzare le intestazioni delle richieste con l'arricciamento della riga di comando


568

L'arricciatura della riga di comando può visualizzare l'intestazione della risposta utilizzando l' -Dopzione, ma voglio vedere quale intestazione della richiesta sta inviando. Come lo posso fare?


28
curl --head http://google.comfarà lo stesso della -Ibandiera :)
Abel Terefe,

9
Nota sull'uso di --head/ -I: non tutti i server rispondono esattamente allo stesso modo alle HEADrichieste (ad esempio, Content-Encodingmancherebbe se si stesse tentando di verificare che il corpo fosse gzip) e non tutti i server supportano HEAD. -vdi solito è la scelta più sicura.
cfeduke,

Risposte:


752

curl -vo l' --verboseopzione mostra le intestazioni della richiesta HTTP, tra le altre cose. Ecco alcuni esempi di output:

$ 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
Cosa succede se voglio solo costruire il pacchetto ma non voglio inviarlo?
PuercoPop,

@jacobsimeon Penso che sia perché mostra non solo le intestazioni di richiesta ma anche le intestazioni di risposta e il corpo di risposta .
Pmpr

236

Una risposta popolare per la visualizzazione delle intestazioni di risposta , ma OP ha chiesto informazioni sulle intestazioni di richiesta .

curl -s -D - -o /dev/null http://example.com
  • -s : Evitare di visualizzare la barra di avanzamento
  • -D -: Scarica le intestazioni su un file, ma lo -invia a stdout
  • -o /dev/null : Ignora il corpo della risposta

È meglio che -Inon invia una HEADrichiesta, che può produrre risultati diversi.

È meglio che -vperché non hai bisogno di così tanti hack per non dirlo in dettaglio.


17
Leggi la domanda - questo è per le intestazioni di risposta e non per le intestazioni di richiesta
Graeme Stuart

58
Questa risposta mi è utile perché ho letto male la domanda.
Liam,

2
Questo comando è un po 'diverso per Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov,

2
@SergeyVlasov In realtà, l'equivalente di /dev/nullin Windows nulnon lo è null.
Francisco Zarabozo,

2
Anche se questa domanda richiede intestazioni di richiesta, Google sta indirizzando tutti coloro che sono alla ricerca di intestazioni di risposta, quindi siamo tutti contenti che questa risposta sia qui. E questa risposta è la migliore per ottenere le intestazioni di risposta. Grazie!!!
biomiker,

96

Credo che l'opzione della riga di comando che stai cercando di passare all'arricciatura sia -I.

Esempio di utilizzo:

$ 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

Inoltre, se riscontri un codice di stato HTTP di risposta di 301, potresti anche passare un -Lparametro argomento per dire curldi seguire i reindirizzamenti URL e, in questo caso, stampare le intestazioni di tutte le pagine (inclusi i reindirizzamenti URL), illustrate di seguito :

$ 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
L' -Iopzione mostra le intestazioni di risposta . La domanda riguardava le intestazioni della richiesta .
Asaf,

53
Le -Iopzioni fanno arricciare una cosa HTTP HEAD, che potrebbe cambiare la risposta dal server. Meglio usare l' -vinterruttore credo.
dal

1
Se provi questo con qualcosa di diverso da una HEADrichiesta (come -X POST) e ottieni "Puoi selezionare solo una richiesta HTTP!" che stackoverflow.com/questions/286982/… probabilmente ti aiuterà. Il fatto è che -Ifa una HEADrichiesta, come acwindicato e quando la tua curlchiamata è impostata per fare un'altra chiamata hai due richieste HTTP in curlchiamata ...
influenza

7
Questa è una risposta molto sbagliata (Prometto che di solito sono molto gentile qui.) 1. Fa il contrario di ciò che l'OP chiede. 2. Utilizza un metodo di richiesta HEADinvece di GETo POST. 3. Non dovrebbe MAI essere usato per "vedere solo le intestazioni" a meno che non si stia cercando di vedere come il proprio server risponde in modo diverso a a HEADanziché a GET. Sarà lo stesso per la maggior parte del tempo, ma non sempre. Per vedere solo le intestazioni usare curl -o /dev/null -D /dev/stdout. Ciò fornirà i risultati previsti il ​​100% delle volte.
Bruno Bronosky,

79

L'opzione dettagliata è utile, ma se vuoi vedere tutto ciò che fa il ricciolo (incluso il corpo HTTP che viene trasmesso, e non solo le intestazioni), ti suggerisco di utilizzare una delle opzioni seguenti:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # file

Non la penso così perché mostra anche le intestazioni e il corpo della risposta!
Pmpr

56

Ottieni un buon output di intestazione con il seguente comando:

 curl -L -v -s -o /dev/null google.de
  • -L, --location seguire i reindirizzamenti
  • -v, --verbose più output, indica la direzione
  • -s, --silent non mostrare una barra di avanzamento
  • -o, --output /dev/null non mostrare il corpo ricevuto

O la versione più breve:

 curl -Lvso /dev/null google.de

Risultati 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

Come puoi vedere, curlemette sia le intestazioni in uscita che quelle in entrata e salta i dati del corpo anche se ti dice quanto è grande il corpo.

Inoltre per ogni riga viene indicata la direzione in modo che sia di facile lettura. Ho trovato particolarmente utile rintracciare lunghe catene di reindirizzamenti.


4
Mi piace meglio -vdell'opzione con voti più alti. Inoltre, solo per brevità questo può anche essere curl -Lvso /dev/null <target>fino a quando oarriva alla fine.
grido

12

Un comando come quello sotto mostrerà tre sezioni: intestazioni di richiesta, intestazioni di risposta e dati (separati da CRLF). Evita le informazioni tecniche e il rumore sintattico aggiunto dall'arricciatura.

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

Il comando produrrà il seguente output:

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>

Descrizione:

  • -vs - aggiungi le intestazioni (-v) ma rimuove la barra di avanzamento (-s)
  • 2>&1 - combina stdout e stderr in singolo stdout
  • sed - modifica la risposta prodotta dall'arricciatura usando i comandi seguenti
  • /^* /d - rimuovi le righe che iniziano con '*' (informazioni tecniche)
  • /bytes data]$/d - rimuove le righe che terminano con "dati byte]" (informazioni tecniche)
  • s/> // - rimuovi il prefisso '>'
  • s/< // - rimuovi il prefisso '<'

7

Ho dovuto superare questo problema da solo, durante il debug delle applicazioni web. -vè fantastico, ma un po ' troppo prolisso per i miei gusti. Questa è la soluzione (solo bash) che mi è venuta in mente:

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

Questo funziona perché l'output da -vviene inviato a stderr, non a stdout. Reindirizzando questo a una subshell, possiamo sedfarlo per rimuovere le righe che iniziano con *. Poiché l'output reale non passa attraverso la subshell, non è interessato. L'uso di una subshell è un po 'pesante, ma è il modo più semplice per reindirizzare stderr a un altro comando. (Come ho notato, lo sto usando solo per i test, quindi funziona bene per me.)


4

l'opzione -v per arricciatura è troppo dettagliata nell'output dell'errore che contiene il primo *(riga di stato) o >(campo head di richiesta) o <(campo head di risposta). per ottenere solo il campo head della richiesta:

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

per ottenere solo il campo head della richiesta:

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

o per scaricarlo in un /tmp/test.txtfile con l'opzione -D

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

per filtrare l' -voutput, è necessario indirizzare l'output dell'errore sul terminale e l'output std su / dev / null, l'opzione -s è vietare la misurazione dell'avanzamento


1

Se desideri più alternative, puoi provare a installare un client HTTP a riga di comando moderno come httpie che è disponibile per la maggior parte dei sistemi operativi con gestori di pacchetti come brew, apt-get, pip, yum ecc.

ad es .: - Per OSX

brew install httpie

Quindi puoi usarlo dalla riga di comando con varie opzioni

http GET https://www.google.com

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.