シェルスクリプトでサイトの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でこのスクリプトを実行し、そのようなメッセージを書き込むと、実行するたびに、サイトが正常であっても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_effectiveとredirect_urlを要求することにより、curlでさらに簡単にネイティブ化できます。

#!/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を追加-Lし、curlにリダイレクトを追跡するよう指示します。

$ ./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.