Как получить (только) статус 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

Проблема здесь не в том, что я делаю, я не могу заставить ее прекратить печатать следующее на стандартный вывод:

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

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

Как я могу получить код состояния без попадания мусора в стандартный вывод? Этот код работает за исключением бонусного барахла на стандартный вывод, который не позволяет мне его использовать.

Джефф Шаллер
источник

Ответы:

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, к примеру.

ДМИТРИЙ МАЛИКОВ
источник
Спасибо! это меня очень раздражало. (и они должны упомянуть об этом в разделе «
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]}
nicerobot
источник
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
UNIXMAN
источник
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

Это может быть дополнительно упрощено изначально в curl, запрашивая 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указанием фактического имени) или «Как указали другие»
Anthon