Як отримати (лише) http-статус сайту в сценарії оболонки?


13

Думаю, завивка зробить цю роботу. Я написав сценарій:

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

Проблема тут, незалежно від того, що я роблю, я не можу змусити її перестати друкувати нижче на stdout:

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

Я хочу, щоб cronjob запустив цей сценарій, і якщо він пише таке повідомлення, то кожного разу, коли я запускаю його, я отримуватиму електронний лист, тому що щось надруковано для stdout у cron, навіть якщо сайт може бути добре.

Як мені отримати код статусу, не потрапляючи в stdout? Цей код працює за винятком бонусного сміття до stdout, заважаючи мені його використовувати.

Відповіді:


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

Таким чином, ваш вигляд повинен виглядати

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

Результат Error 301 on google.com, наприклад.


Дякую! це мене так дратувало. (і вони повинні згадати це під "метром прогресу" на сторінці "man")

10

ти хочеш

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

Це дасть вам код HTTP_STATUS як єдиний вихід.


2

Я б це зробив так, щоб переспрямувати на остаточний хост і отримати відповідь від нього:

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

2

Використовуйте це як свій стан ...

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

як зазначено вище, curl може спочатку забезпечити відповідь 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

Приклад 1, коли -sми замовчуємо прогрес, і -o /dev/nullдозволяє нам відшукати відповіді, але -wваш союзник тут:

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

Це можна додатково спростити в скруті, запросивши URL-адреси url_effective та 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

У прикладі 2 ми бачимо наш початковий відповідь http, оригінальні запитувані домени та перенаправлення, на який сервер відповів:

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

Однак якщо ви в кінцевому рахунку хочете встановити відповідь 200 навіть після перенаправлення 301 або 302: тоді ви можете відмовитись від вищезгаданого "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

У прикладі 3 ми додаємо, -Lякий вказує curl, щоб переслідувати переспрямування:

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

Ласкаво просимо до U&L. Ваше перше речення зазначає "як зазначено вище", що заплутано, оскільки позиція вашої відповіді залежить від голосів та налаштувань користувача. Краще скористатися рядком "Як @some_user вказувалося вище" (з some_userфактичним назвою) або "Як інші вказували"
Ентон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.