Wie erhalte ich (nur) den http-Status einer Site in einem Shell-Skript?

13

Ich glaube, Curl würde den Job machen. Ich schrieb in einem Skript:

#!/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

Das Problem ist hier, egal was ich tue. Ich kann nicht verhindern, dass das Folgende auf stdout gedruckt wird:

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

Ich möchte, dass ein Cronjob dieses Skript ausführt, und wenn er eine solche Nachricht schreibt, erhalte ich jedes Mal eine E-Mail, wenn ich sie ausführe, weil etwas in Cron gedruckt wurde, auch wenn die Site möglicherweise in Ordnung ist.

Wie erhalte ich den Statuscode, ohne in stdout zu geraten? Dieser Code funktioniert nur, wenn der Bonus-Junk für die Standardausgabe mich daran hindert, ihn zu verwenden.

Jeff Schaller
quelle

Antworten:

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

So sollte Ihre res aussehen

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

Ergebnis ist Error 301 on google.comzum Beispiel.

ДМИТРИЙ МАЛИКОВ
quelle
Vielen Dank! das irritierte mich so sehr. (und sie sollten dies unter "Fortschrittsanzeige" in der Manpage
10

Sie wollen

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

Dadurch erhalten Sie den HTTP_STATUS-Code als einzige Ausgabe.

Tim Kennedy
quelle
2

Ich würde es so machen, um sicherzustellen, dass ich zum endgültigen Host weitergeleitet werde und die Antwort von diesem bekomme:

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

Verwenden Sie dies als Ihre Bedingung ...

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
quelle
1

Wie oben erwähnt, kann curl nativ die http-Antwort liefern:

#!/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

Beispiel 1, in dem -swir den Fortschritt zum Schweigen bringen und die -o /dev/nullAntwort verwerfen lassen, aber -wIhr Verbündeter ist hier:

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

Dies kann nativ in curl weiter vereinfacht werden, indem Sie nach url_effective und redirect_url fragen:

#!/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

In Beispiel 2 sehen wir unsere anfängliche http-Antwort, die ursprünglich angeforderten Domänen und leiten den Server um, mit dem geantwortet wurde:

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

Wenn Sie jedoch letztendlich auch nach einer 301- oder 302-Umleitung eine Antwort von 200 erstellen möchten, können Sie die oben genannte 'redirect_url' löschen.

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

In Beispiel 3 fügen wir hinzu, -Lwas curl anweist, die Weiterleitung (en) zu verfolgen:

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/
Hinweis nach innen
quelle
Willkommen bei U & L. Ihr erster Satz besagt "wie oben erwähnt", was verwirrend ist, da die Position Ihrer Antwort von Stimmen und Benutzereinstellungen abhängt. Es ist besser, eine Zeile zu verwenden "Wie @some_user oben hingewiesen" (mit some_usereinem tatsächlichen Namen) oder "Wie andere darauf hingewiesen haben"
Anthon