ejercicio - Cómo mostrar los encabezados de solicitud con la línea de comando curl
curl post (9)
Creo que el interruptor de línea de comando que está buscando para 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, también le gustaría pasar un -L
argumento -L
para decirle a curl
que siga los redireccionamientos de URL y, en este caso, imprima los encabezados de todas las páginas (incluidos los redireccionamientos de URL) , ilustrado abajo:
$ 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
La línea de comando curl puede mostrar el encabezado de respuesta usando la opción -D
, pero quiero ver qué encabezado de solicitud está enviando. ¿Cómo puedo hacer eso?
La opción -v
o --verbose
curl 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
La opción verbosa 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
# file
Obtienes una salida de encabezado agradable con el siguiente comando:
curl -L -v -s -o /dev/null google.de
-
-L, --location
sigue redirecciones -
-v, --verbose
más salida, indica la dirección -
-s, --silent
no muestra una barra de progreso -
-o, --output /dev/null
no muestra 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, las salidas de curl
, tanto las de salida como las de entrada, omiten los datos del cuerpo, aunque le indican qué tan grande es el cuerpo.
Además, para cada línea, la dirección se indica de modo que sea fácil de leer. Me pareció particularmente útil rastrear largas cadenas de redirecciones.
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 puedes use en la línea de comandos con varias opciones.
http GET https://www.google.com
Tuve que superar este problema yo mismo, al depurar aplicaciones web. -v
es genial, pero un poco demasiado detallado para mi gusto. 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 -v
se envía a stderr, no a stdout. Al redirigir esto a una subshell, podemos crear sed
para eliminar las líneas que comienzan con *
. Dado que la salida real no pasa a través de la subshell, no se ve afectada. El uso de un subshell es un poco torpe, pero es la forma más fácil de redirigir stderr a otro comando. (Como señalé, solo uso esto para las pruebas, por lo que funciona bien para mí).
en php set curl options
CURLINFO_HEADER_OUT => true,
CURLOPT_HEADER => 1,
y tal vez volcar el resultado del encabezado en mysql .. para un registro más fácil.
También puede usar wireshark si usa el navegador para obtener información más detallada que la que ofrece F12 / Firebug
la opción -v para curl es demasiado detallada en la salida de error que contiene el *
(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..com 2>&1 >/dev/null | grep ''>'' | cut -c1-2 --complement
para obtener solo el campo de encabezado de solicitud:
curl -v -sS www..com 2>&1 >/dev/null | grep ''<'' | cut -c1-2 --complement
o para /tmp/test.txt
en el archivo /tmp/test.txt
con la opción -D
curl -D /tmp/test.txt -sS www..com > /dev/null
para filtrar la salida -v
, 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 de progreso
curl -sD - -o /dev/null http://example.com
-
-s
- Evita mostrar la barra de progreso -
-D -
- Volcar encabezados a un archivo, pero-
envía a la salida estándar -
-o /dev/null
- Ignora el cuerpo de respuesta
Esto es mejor que -I
ya que no envía una solicitud HEAD
, que puede producir resultados diferentes.
Es mejor que -v
porque no necesitas tantos hacks para deshacerlo.