如何在 shell 脚本中(仅)获取站点的 http 状态?

如何在 shell 脚本中(仅)获取站点的 http 状态?

我认为curl可以完成这项工作。我在脚本中写道:

#!/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 的标准输出中,即使该网站可能没问题。

如何获取状态代码而不将垃圾内容放入标准输出?这段代码可以工作,除了标准输出的额外垃圾阻止我使用它。

答案1

   -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例如,结果是。

答案2

你要

...
res=$( curl -w %{http_code} -s --output /dev/null $1)
...

这将为您提供 HTTP_STATUS 代码作为唯一的输出。

答案3

我会这样做,以确保我被重定向到最终主机并从中获得响应:

res=($(curl -sLI "${1}" | grep '^HTTP/1' | tail -1))
((res[1] == 200)) || echo ${res[2]}

答案4

如上所述,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/

相关内容