Comment obtenir (uniquement) le statut http d'un site dans un script shell?

13

Je pense que curl ferait l'affaire. J'ai écrit dans un script:

#!/bin/sh

function test {
    res=`curl -I $1 | grep HTTP/1.1 | awk {'print $2'}`
    if [ $res -ne 200 ]
    then
        echo "Error $res on $1"
    fi
}  

test mysite.com
test google.com

Le problème ici est, peu importe ce que je fais, je n'arrive pas à arrêter l'impression de ce qui suit sur stdout:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

Je veux qu'un cronjob exécute ce script et s'il écrit un tel message, chaque fois que je l'exécuterai, j'obtiendrai un e-mail car quelque chose a été imprimé sur stdout dans cron, même si le site peut convenir.

Comment puis-je obtenir le code d'état sans mettre de courrier indésirable dans stdout? Ce code fonctionne sauf la jonque bonus de la sortie standard qui m'empêche de l'utiliser.

Jeff Schaller
la source

Réponses:

12
   -s/--silent
          Silent or quiet mode. Don't show progress meter 
          or error messages.  Makes Curl mute.

Donc vos res devraient ressembler à

res=`curl -s -I $1 | grep HTTP/1.1 | awk {'print $2'}`

Le résultat est Error 301 on google.com, par exemple.

ДМИТРИЙ МАЛИКОВ
la source
Je vous remercie! cela m'a tellement irrité. (et ils devraient le mentionner sous le "compteur de progression" dans la page de manuel)
10

tu veux

...
res=$( curl -w %{http_code} -s --output /dev/null $1)
...

Cela vous donnera le code HTTP_STATUS comme seule sortie.

Tim Kennedy
la source
2

Je le ferais comme ça pour m'assurer d'être redirigé vers l'hôte final et d'obtenir la réponse de celui-ci:

res=($(curl -sLI "${1}" | grep '^HTTP/1' | tail -1))
((res[1] == 200)) || echo ${res[2]}
nicerobot
la source
2

Utilisez ceci comme votre condition ...

res=`curl -s --head <URL> | head -n 1 | grep -c HTTP/1.1 200 OK`

if [ $res -eq 1 ]
then
MSG = " OKAY"
EXIT_CODE = 0
else
MSG = " NOT OKAY"
EXIT_CODE = 2
fi
UNIXMAN
la source
1

comme indiqué ci-dessus, curl peut fournir nativement la réponse http:

#!/bin/bash
#example1.sh
function test {
  RESPONSE=$(curl -so /dev/null -w "%{http_code}\n" ${1})
  if [[ $RESPONSE != 200 ]]; then
    echo "Error ${RESPONSE} on ${1}"
  fi
}    
test mysite.com
test google.com

Exemple 1 avec -snous faisons taire la progression et -o /dev/nullnous permet de jeter la réponse mais -west votre allié ici:

$ ./example1.sh 
Error 000 on mysite.com
Error 301 on google.com

Cela peut être encore simplifié en natif dans curl en demandant les url_effective et redirect_url:

#!/bin/bash
#example2.sh
function test {
  curl -so /dev/null -w "%{http_code}\t%{url_effective}\t%{redirect_url}\n" ${1}
}  
test mysite.com
test google.com

Exemple 2, nous voyons notre réponse http initiale, les domaines demandés d'origine et redirige le serveur avec:

$ ./example2.sh 
000 HTTP://mysite.com/  
301 HTTP://google.com/  http://www.google.com/

Cependant, si vous cherchez en fin de compte à établir une réponse 200 même après une redirection 301 ou 302: alors vous pouvez et supprimer le 'redirect_url' susmentionné

#!/bin/bash
#example3.sh
function test {
  curl -sLo /dev/null -w "%{http_code}\t%{url_effective}\n" ${1}
}  
test mysite.com
test google.com

Exemple 3, nous ajoutons -Lqui demande à curl de poursuivre la ou les redirection (s):

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/
Indice laissé à l'intérieur
la source
Bienvenue chez U&L. Votre première phrase indique "comme indiqué ci-dessus", ce qui prête à confusion car la position de votre réponse dépend des votes et des paramètres utilisateur. Il est préférable d'utiliser une ligne "Comme @some_user l'a souligné ci-dessus" (avec some_userun nom réel) ou "Comme d'autres l'ont souligné"
Anthon