Estou usando curl
na linha de comando no Linux para emitir solicitações HTTP. Os corpos de resposta são impressos com padrão, o que é bom, mas não consigo ver na página de manual como obter curl para imprimir o código de status HTTP a partir da resposta (404, 403, etc.). Isso é possível?
799
-i
bandeira, como noscurl -i https://www.example.com/
, é provavelmente o que você quer, como por superuser.com/a/514798/190188curl -IL http://www.example.com | grep "^HTTP\/"
?Respostas:
Isso deve funcionar para você se o servidor da web puder responder às solicitações HEAD (isso não será executado a
GET
):Além disso, para permitir que o cURL siga os redirecionamentos (status 3xx), adicione -L.
fonte
curl -I
faz uma solicitação HTTP HEAD, o que pode ser problemático para testar o código de status HTTP para alguns servidores e serviços de aplicativos webhead -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
. Adicione -L para curvar se precisar do status final após os redirecionamentos.curl -I -X GET
enviará uma solicitação GET, mas fornecerá a mesma saída.Uma maneira mais específica de imprimir apenas o código de status HTTP é algo como:
Muito mais fácil de trabalhar em scripts, pois não requer análise :-)
O parâmetro
-I
pode ser adicionado para melhorar o desempenho do carregamento de resposta. Este parâmetro apenas solicita status / cabeçalhos de resposta, sem o corpo da resposta do download.Nota:
%{http_code}
retorna na primeira linha da carga útil HTTPou seja:
fonte
/dev/null
coisa ainda funciona na versão do Windows do curl que estou usando.httping -c 1 -s -G -m
emite um GET e não baixa o arquivo inteiro, embora eu saiba que essa pergunta é especificamente sobre curl.-s
= Não mostra o progresso do download,-o /dev/null
= não exibe o corpo,-w "%{http_code}"
= Escreva o código de resposta http no stdout após a saída.Se você deseja ver o cabeçalho e o resultado, pode usar a opção detalhada:
O status aparecerá no cabeçalho. Por exemplo
fonte
Você pode imprimir o código de status, além de todos os cabeçalhos, fazendo o seguinte:
O bom
-i
é que ele também funciona-X POST
.fonte
-i
funciona com qualquer método HTTP, não apenasGET
ePOST
... :)-s
(não mostrar mensagens medidor de progresso ou de erro) e-S
(fazer mensagens show de erro depois de tudo)Se você deseja capturar o código de status HTTP em uma variável, mas ainda redirecionar o conteúdo para STDOUT, crie duas STDOUTs. Você pode fazer isso com a substituição do processo> () e a substituição do comando $ () .
Primeiro, crie um descritor de arquivo
3
para o seu processo atual 'STDOUT withexec 3>&1
.Em seguida, use a
-o
opção curl para redirecionar o conteúdo da resposta para um fifo temporário usando substituição de comando e, dentro dessa substituição de comando, redirecione a saída de volta ao seu descritor de arquivo STDOUT do processo atual3
com-o >(cat >&3)
.Juntando tudo em
bash
3.2.57(1)-release
(padrão paramacOS
):Observe que isso não funciona
/bin/sh
como o SamK observou nos comentários abaixo .fonte
STDOUT
, você deve poder redirecionar a saída do comando para qualquer lugar que desejar, como um comando regular. Ainda não testei isso.Redefinir a saída de ondulação:
Pode ser usado com qualquer tipo de solicitação.
fonte
SOMENTE código de status
Todo o crédito a este GIST
fonte
Essa é uma
curl --fail
limitação dolorosa . Deman curl
:Mas não há como obter o código de retorno diferente de zero E o corpo da resposta no stdout.
Com base na resposta de pvandenberk e neste outro truque muito útil aprendido no SO , aqui está uma solução alternativa:
Essa função se comporta exatamente como
curl
, mas retornará 127 (um código de retorno não utilizado porcurl
) no caso de um código HTTP no intervalo [400, 600 [.fonte
Isso enviará uma solicitação para o URL, obtenha apenas a primeira linha da resposta, divida-a em blocos e selecione a segunda.
Ele contém o código de resposta
fonte
Para uma solicitação POST, o seguinte funcionou:
fonte
Use o seguinte comando cURL e envie-o para grep da seguinte maneira:
Aqui está o que cada sinalizador faz:
-I
: Mostrar apenas cabeçalhos de resposta-s
: Silencioso - não mostrar barra de progresso-L
: SeguirLocation:
cabeçalhosAqui está um link para os códigos de status HTTP .
Execute a partir da linha de comando. Essa onda é executada no modo silencioso, segue todos os redirecionamentos, obtém os cabeçalhos HTTP. O grep imprimirá o código de status HTTP na saída padrão.
fonte
Isso retornará as seguintes informações:
fonte
Aqui está um comando curl que está usando
GET
e que retorna o código HTTP.Lembre-se de que a abordagem abaixo está sendo usada
HEAD
, que é mais rápida, mas pode não funcionar bem com alguns servidores HTTP menos compatíveis com a Web.fonte
Um exemplo de como usar os códigos de resposta. Eu uso isso para baixar novamente os bancos de dados Geolite apenas se eles foram alterados (
-z
) e também após redirecionamentos (-L
):fonte
O OP quer saber o código de status. Freqüentemente, ao baixar um arquivo, você também quer ter uma ideia do seu tamanho, então estou usando o curl primeiro para mostrar o código de status e o tamanho do arquivo e, em seguida, desative o arquivo detalhado e direto para o local e o nome que desejo:
Então eu espero pelo acabamento do cacho
antes de executar o próximo comando. O exemplo acima, quando usado em um script de muitos comandos como o acima, fornece uma boa resposta, como:
Observe que -o in curl precisa ser seguido pelo caminho completo do arquivo + nome do arquivo. Dessa forma, você pode salvar arquivos em uma estrutura de nome sensível quando você os desativa com curvatura. Observe também que -s e -S usados juntos silenciam a saída, mas mostram erros. Observe também que -R tenta definir o registro de data e hora do arquivo para o arquivo da web.
Minha resposta é baseada no que o @pvandenberk sugeriu originalmente, mas além disso, ele salva o arquivo em algum lugar, em vez de apenas direcionar para / dev / null.
fonte
Divida o conteúdo de saída
stdout
e o código de status HTTP parastderr
:Se apenas o código de status HTTP for desejado para stderr,
--silent
poderá ser usado:O fluxo desejado pode ser escolhido redirecionando o indesejado para
/dev/null
:Observe que, para o segundo redirecionamento se comportar conforme desejado, precisamos executar o comando curl no subshell.
fonte
bash
substituição de processo./tmp/out
/tmp/err
arquivos podem causar resultados inesperados se forem executados em paralelo.