Jak uzyskać (tylko) status http witryny w skrypcie powłoki?


13

Sądzę, że curl zrobiłby robotę. Napisałem w skrypcie:

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

Problem tutaj nie ma znaczenia, co robię, nie mogę go zatrzymać, aby przestał drukować poniżej na standardowe wyjście:

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

Chcę, aby cronjob uruchomił ten skrypt i jeśli napisze taką wiadomość, to za każdym razem, gdy go uruchomię, dostanę wiadomość e-mail, ponieważ coś zostało wydrukowane na standardowe wyjście w cronie, nawet jeśli strona może być w porządku.

Jak uzyskać kod stanu bez wprowadzania śmieci do standardowego wyjścia? Ten kod działa oprócz bonusowej śmieci na standardowe wyjście, uniemożliwiającej mi jego użycie.

Odpowiedzi:


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

Więc twój res powinien wyglądać

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

Wynik jest Error 301 on google.comna przykład.


Dziękuję Ci! bardzo mnie to irytowało. (i powinni wspomnieć o tym pod „wskaźnikiem postępu” na stronie

10

chcesz

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

To da ci kod HTTP_STATUS jako jedyne wyjście.


2

Zrobiłbym to w ten sposób, aby upewnić się, że nastąpi przekierowanie do hosta końcowego i otrzymam od niego odpowiedź:

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

2

Użyj tego jako warunku ...

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

1

jak wskazano powyżej curl może natywnie dostarczyć odpowiedź 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

Przykład 1, w -sktórym wyciszamy postęp i -o /dev/nullpozwalasz nam skasować odpowiedź, ale -wczy jesteś tutaj twoim sprzymierzeńcem:

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

Można to dodatkowo uprościć natywnie w curl, prosząc o url_effective i 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

W przykładzie 2 widzimy naszą początkową odpowiedź http, pierwotnie żądane domeny i przekierowujemy serwer z odpowiedzią:

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

Jeśli jednak ostatecznie chcesz ustalić odpowiedź 200, nawet po przekierowaniu 301 lub 302: Następnie możesz i upuścić wspomniany „redirect_url”

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

Przykład 3 dodajemy, -Lktóry instruuje curl, aby ścigał przekierowania:

$ ./example3.sh 
000 HTTP://mysite.com/
200 http://www.google.com/

Witamy w U&L. Pierwsze zdanie brzmi „jak wskazano powyżej”, co jest mylące, ponieważ pozycja odpowiedzi zależy od głosów i ustawień użytkownika. Lepiej jest użyć wiersza „Jak @some_user wskazał powyżej” ( some_userbędącego faktyczną nazwą) lub „Jak inni wskazali”
Anthon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.