Cómo mostrar encabezados de solicitud con línea de comando curl

568

La línea de comando curl puede mostrar el encabezado de respuesta usando la -Dopción, pero quiero ver qué encabezado de solicitud está enviando. ¿Cómo puedo hacer eso?

wwwxml
fuente
28
curl --head http://google.comhará lo mismo que la -Ibandera :)
Abel Terefe
99
Nota sobre el uso de --head/ -I: no todos los servidores responden exactamente igual a las HEADsolicitudes (por ejemplo, Content-Encodingfaltaría si intentara verificar que el cuerpo se comprimiría) y no todos los servidores son compatibles HEAD. -vsuele ser la opción más segura.
cfeduke

Respuestas:

752

curl's -vu --verboseoption muestra los encabezados de solicitud HTTP, entre otras cosas. Aquí hay algunos resultados de muestra:

$ 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
fuente
66
¿Qué sucede si solo quiero construir el paquete pero no quiero enviarlo?
PuercoPop
@jacobsimeon Creo que es porque muestra no solo los encabezados de Solicitud sino también los encabezados de Respuesta y el cuerpo de Respuesta .
Pmpr
236

Una respuesta popular para mostrar encabezados de respuesta , pero OP preguntó sobre encabezados de solicitud .

curl -s -D - -o /dev/null http://example.com
  • -s : Evite mostrar la barra de progreso
  • -D -: Volcar encabezados en un archivo, pero lo -envía a stdout
  • -o /dev/null : Ignorar cuerpo de respuesta

Esto es mejor que -Iya que no envía una HEADsolicitud, que puede producir resultados diferentes.

Es mejor que -vporque no necesitas tantos trucos para desvelarlo.

JaffaTheCake
fuente
17
Lea la pregunta: esto es para encabezados de respuesta, no para encabezados de solicitud
Graeme Stuart
58
Esta respuesta me es útil porque también leí mal la pregunta.
Liam
2
Este comando es un poco diferente para Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov
2
@SergeyVlasov En realidad, el equivalente de /dev/nullen Windows nulno lo es null.
Francisco Zarabozo
2
Aunque esta pregunta solicita encabezados de solicitud, Google está dirigiendo a todos los que están buscando encabezados de respuesta, por lo que todos estamos contentos de que esta respuesta esté aquí. Y esta respuesta es la mejor para obtener encabezados de respuesta. ¡¡¡Gracias!!!
biomiker
96

Creo que el cambio de línea de comando que está buscando pasar a curl es -I.

Ejemplo de uso:

$ 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

Además, si encuentra un código de estado HTTP de respuesta de 301, es posible que también desee pasar un -Lcambio de argumento para indicar curlque siga las redirecciones de URL y, en este caso, imprima los encabezados de todas las páginas (incluidas las redirecciones de URL), como se ilustra a continuación :

$ 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
fuente
38
La -Iopción muestra los encabezados de respuesta . La pregunta era sobre los encabezados de solicitud .
Asaph
53
Las -Iopciones hacen que curl haga un HTTP HEAD, lo que podría cambiar la respuesta del servidor. Mejor usar el -vinterruptor, creo.
acw
1
Si intenta esto con algo más que una HEADsolicitud (como -X POST) y obtiene "¡Solo puede seleccionar una solicitud HTTP!" que stackoverflow.com/questions/286982/… probablemente te ayudará. El caso es que -Ihace una HEADpetición, como acwse indica y cuando el curlestablecimiento de llamada a hacer otra llamada que tener dos peticiones HTTP en curlla llamada ...
la gripe
77
Esta es una respuesta muy incorrecta. (Prometo que generalmente soy muy amable aquí). 1. Hace lo contrario de lo que pide el OP. 2. Utiliza un método de solicitud de en HEADlugar de GETo POST. 3. NUNCA debe usarse para "solo ver los encabezados" a menos que esté tratando de ver cómo su servidor responde de manera diferente a a HEADen lugar de a GET. Será lo mismo la mayor parte del tiempo, pero no siempre. Para ver solo el uso de encabezados curl -o /dev/null -D /dev/stdout. Eso dará los resultados esperados el 100% del tiempo.
Bruno Bronosky
79

La opción detallada es útil, pero si desea ver todo lo que hace curl (incluido el cuerpo HTTP que se transmite, y no solo los encabezados), sugiero usar una de las siguientes opciones:

  • --trace-ascii - # stdout
  • --trace-ascii output_file.txt # archivo
William Denniss
fuente
¡No lo creo, ya que también muestra los encabezados de respuesta y el cuerpo!
Pmpr
56

Obtiene una buena salida de encabezado con el siguiente comando:

 curl -L -v -s -o /dev/null google.de
  • -L, --location seguir redireccionamientos
  • -v, --verbose más salida, indica la dirección
  • -s, --silent no mostrar una barra de progreso
  • -o, --output /dev/null no mostrar el cuerpo recibido

O la versión más corta:

 curl -Lvso /dev/null google.de

Resultados en:

* 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

Como puede ver, curlgenera tanto los encabezados salientes como los entrantes y omite los datos del cuerpo, aunque le dice cuán grande es el cuerpo.

Además, para cada línea se indica la dirección para que sea fácil de leer. Me pareció particularmente útil rastrear largas cadenas de redireccionamientos.

Benibr
fuente
44
Me gusta más que la -vopción con más votos. Además, solo por brevedad, esto también puede ser curl -Lvso /dev/null <target>tan largo como oel final.
chillido
12

Un comando como el siguiente mostrará tres secciones: encabezados de solicitud, encabezados de respuesta y datos (separados por CRLF). Evita la información técnica y el ruido sintáctico agregado por curl.

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

El comando producirá el siguiente resultado:

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>

Descripción:

  • -vs - agregue encabezados (-v) pero elimine la barra de progreso (-s)
  • 2>&1 - combina stdout y stderr en stdout simple
  • sed - Edite la respuesta producida por curl utilizando los siguientes comandos
  • /^* /d - eliminar líneas que comienzan con '*' (información técnica)
  • /bytes data]$/d - eliminar líneas que terminan con 'datos de bytes]' (información técnica)
  • s/> // - eliminar el prefijo '>'
  • s/< // - eliminar el prefijo '<'
igorpcholkin
fuente
7

Tuve que superar este problema yo mismo al depurar aplicaciones web. -ves genial, pero demasiado detallado para mis gustos. Esta es la solución (solo bash) que se me ocurrió:

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

Esto funciona porque la salida de -vse envía a stderr, no a stdout. Al redirigir esto a una subshell, podemos sedeliminar líneas que comienzan con *. Como la salida real no pasa a través de la subshell, no se ve afectada. Usar una subshell es un poco difícil, pero es la forma más fácil de redirigir stderr a otro comando. (Como señalé, solo estoy usando esto para probar, por lo que funciona bien para mí).

jpfx1342
fuente
4

la opción -v para curl es demasiado detallada en la salida de error que contiene el inicio *(línea de estado) o >(campo de encabezado de solicitud) o <(campo de encabezado de respuesta). para obtener solo el campo de encabezado de solicitud:

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

para obtener solo el campo de encabezado de solicitud:

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

o volcarlo en un /tmp/test.txtarchivo con la opción -D

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

Para filtrar la -vsalida, debe dirigir la salida de error al terminal y la salida estándar a / dev / null, la opción -s es prohibir la medición del progreso

toolchainX
fuente
1

Si desea más alternativas, puede intentar instalar un cliente HTTP moderno de línea de comandos como httpie que está disponible para la mayoría de los sistemas operativos con gestores de paquetes como brew, apt-get, pip, yum, etc.

por ejemplo: - Para OSX

brew install httpie

Luego puede usarlo en la línea de comandos con varias opciones

http GET https://www.google.com

ingrese la descripción de la imagen aquí

Sudharshan
fuente