Estoy usando curl
la línea de comando en Linux para emitir solicitudes HTTP. Los cuerpos de respuesta se imprimen en estándar, lo cual está bien, pero no puedo ver desde la página del manual cómo obtener curl para imprimir el código de estado HTTP de la respuesta (404, 403, etc.). es posible?
800
-i
bandera, como encurl -i https://www.example.com/
, es probablemente lo que quieres, según superuser.com/a/514798/190188curl -IL http://www.example.com | grep "^HTTP\/"
?Respuestas:
Esto debería funcionar para usted si el servidor web puede responder a las solicitudes HEAD (esto no realizará a
GET
):Como complemento, para que cURL siga los redireccionamientos (estados 3xx) agregue -L.
fuente
curl -I
hace una solicitud HEAD HTTP, lo que puede ser problemático para probar el código de estado HTTP para algunos servidores y servicios de aplicaciones webhead -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
. Agregue -L al rizo si necesita el estado final después de las redirecciones.curl -I -X GET
enviará una solicitud GET, pero dará el mismo resultado.Una forma más específica de imprimir solo el código de estado HTTP es algo similar a:
Es mucho más fácil trabajar con scripts, ya que no requiere ningún análisis :-)
El parámetro
-I
podría agregarse para mejorar el rendimiento de la carga de respuesta. Este parámetro solo solicita estado / encabezados de respuesta, sin descargar el cuerpo de respuesta.Nota:
%{http_code}
regresa en la primera línea de carga HTTPes decir:
fuente
/dev/null
incluso funciona en la versión de Windows de curl que estoy usando.httping -c 1 -s -G -m
emite un GET y no descarga todo el archivo, aunque me doy cuenta de que esta pregunta es específicamente sobre curl.-s
= No muestra el progreso de la descarga,-o /dev/null
= no muestra el cuerpo,-w "%{http_code}"
= Escribe el código de respuesta http en stdout después de salir.Si desea ver el encabezado y el resultado, puede usar la opción detallada:
El estado aparecerá en el encabezado. P.ej
fuente
Puede imprimir el código de estado, además de todos los encabezados, haciendo lo siguiente:
Lo bueno de esto
-i
es que también funciona-X POST
.fuente
-i
funciona con cualquier método HTTP, no soloGET
yPOST
... :)-s
(no mostrar el medidor de progreso o mensajes de error) y-S
(mostrar mensajes de error después de todo)Si desea capturar el código de estado HTTP en una variable, pero aún así redirigir el contenido a STDOUT, debe crear dos STDOUT. Puede hacerlo con la sustitución de proceso> () y la sustitución de comando $ () .
Primero, cree un descriptor de archivo
3
para su proceso actual 'STDOUT withexec 3>&1
.Luego, use la
-o
opción de curl para redirigir el contenido de la respuesta a una respuesta temporal usando la sustitución de comandos, y luego dentro de esa sustitución de comandos, redirija la salida de nuevo al descriptor de archivo STDOUT del proceso actual3
con-o >(cat >&3)
.Poniendo todo junto
bash
3.2.57(1)-release
(estándar paramacOS
):Tenga en cuenta que esto no funciona
/bin/sh
como SamK señaló en los comentarios a continuación .fuente
STDOUT
, por lo que debería poder redirigir la salida del comando a cualquier lugar que desee, como un comando normal. Sin embargo, no he probado esto.Redefinir la salida del rizo:
Se puede usar con cualquier tipo de solicitud.
fuente
Código de estado SOLO
Todo el crédito a este GIST
fuente
Esta es una
curl --fail
limitación dolorosa . Deman curl
:Pero no hay forma de obtener el código de retorno distinto de cero Y el cuerpo de respuesta en stdout.
Basado en la respuesta de pvandenberk y este otro truco muy útil aprendido en SO , aquí hay una solución:
Esta función se comporta exactamente como
curl
, pero devolverá 127 (un código de retorno no utilizado porcurl
) en el caso de un código HTTP en el rango [400, 600 [.fuente
Esto enviará una solicitud a url, obtendrá solo la primera línea de la respuesta, la dividirá en bloques y seleccionará la segunda.
Contiene el código de respuesta.
fuente
Para una solicitud POST, funcionó lo siguiente:
fuente
Use el siguiente comando cURL y canalícelo a grep así:
Esto es lo que hace cada bandera:
-I
: Mostrar solo encabezados de respuesta-s
: Silencioso - No mostrar barra de progreso-L
: SeguirLocation:
encabezadosAquí hay un enlace a los códigos de estado HTTP .
Ejecutar desde la línea de comando. Este rizo se ejecuta en modo silencioso, sigue cualquier redireccionamiento, obtiene los encabezados HTTP. grep imprimirá el código de estado HTTP a la salida estándar.
fuente
Esto devolverá la siguiente información:
fuente
Aquí hay un comando curl que está usando
GET
y que devuelve el código HTTP.Recuerde que está utilizando el siguiente enfoque
HEAD
, que es más rápido pero puede que no funcione bien con algunos servidores HTTP menos compatibles con la web.fuente
Un ejemplo de cómo usar los códigos de respuesta. Lo uso para volver a descargar las bases de datos Geolite solo si han cambiado (
-z
) y también siguiendo los redireccionamientos (-L
):fuente
El OP quiere saber el código de estado. A menudo, al descargar un archivo, también desea tener una idea de su tamaño, así que primero uso curl para mostrar el código de estado y el tamaño del archivo y luego apago el archivo detallado y directo al lugar y el nombre que quiero:
Entonces espero a que termine el rizo
antes de ejecutar el siguiente comando. Lo anterior cuando se usa en un script de muchos comandos como el anterior da una buena respuesta como:
Tenga en cuenta que -o in curl debe ser seguido por la ruta completa del archivo + nombre del archivo. Esto le permite guardar archivos en una estructura de nombre sensible cuando los d / l con curl. También tenga en cuenta que -s y -S usados juntos silencian la salida pero muestran errores. Tenga en cuenta también que -R intenta establecer la marca de tiempo del archivo en la del archivo web.
Mi respuesta se basa en lo que @pvandenberk sugirió originalmente, pero además en realidad guarda el archivo en algún lugar, en lugar de simplemente dirigirlo a / dev / null.
fuente
Divida el contenido de salida
stdout
y el código de estado HTTP parastderr
:Si solo se desea el código de estado HTTP para stderr,
--silent
puede usarse:La secuencia deseada se puede seleccionar redirigiendo una no deseada a
/dev/null
:Tenga en cuenta que para que la segunda redirección se comporte como lo deseamos, necesitamos ejecutar el comando curl en subshell.
fuente
bash
para la sustitución del proceso./tmp/out
/tmp/err
archivos pueden causar resultados inesperados si se ejecutan en paralelo.