如何(仅)在Shell脚本中获取网站的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中,即使该站点可能正常。

如何获取状态代码而又不会陷入标准输出?该代码有效,但标准输出项中的多余垃圾使我无法使用它。

Answers:


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进一步在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.