쉘 스크립트에서 사이트의 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 이이 스크립트를 실행하기를 원하며 그러한 메시지를 작성하면 그것을 실행할 때마다 사이트가 괜찮을지라도 cron에서 stdout으로 인쇄되어 있기 때문에 이메일을 받게됩니다.

정크를 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예를 들어 결과는 다음 과 같습니다.


감사합니다! 이것은 나에게 너무 많은 자극을주었습니다. (그리고 그들은 사람 페이지에서 "진행 미터"에서이 문제를 언급해야한다)

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_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/

그러나 301 또는 302 리디렉션 후에도 궁극적으로 200 응답을 설정하려는 경우 위에서 언급 한 '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 우리는 -Lcurl에게 리디렉션을 추적하도록 지시하는 것을 추가합니다 .

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

U & L에 오신 것을 환영합니다. 답변의 위치가 투표 및 사용자 설정에 따라 다르기 때문에 첫 번째 문장은 "위에서 지적한"상태입니다. "@some_user가 위에서 지적한대로"( some_user실제 이름이 있음) 또는 "다른 사람들이 지적한대로 "어떤 행을 사용하는 것이 좋습니다
Anthon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.