カールがうまくいくと思います。私はスクリプトで書いた:
#!/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へのボーナスジャンクを除いて機能しますが、使用できません。
-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
、 例えば。
あなたが欲しい
...
res=$( curl -w %{http_code} -s --output /dev/null $1)
...
これにより、HTTP_STATUSコードのみが出力されます。
これを条件として使用してください...
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
最終的なホストにリダイレクトされ、それから応答が返されるようにするには、次のようにします。
res=($(curl -sLI "${1}" | grep '^HTTP/1' | tail -1))
((res[1] == 200)) || echo ${res[2]}
上記で指摘したように、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リダイレクトを追跡するようにcurlに指示する-L
を追加します。
$ ./example3.sh
000 HTTP://mysite.com/
200 http://www.google.com/