YOLO813

监测网站是否正常运行并发送邮件的Shell脚本

    最近网站老是被人攻击,出了问题事后才知道,实在是受不了,干脆写了一个自动监测网站的脚本。之前在centos上使用mail直接发送邮件写过linux服务器如何配置邮箱地址,这一次就直接尝试写一个shell脚本来进行监测。

    原理:利用网页是否返回200状态码来进行判断,如果只需要返回状态码,直接使用curl请求即可。

    例如:

curl -I -s -w "%{http_code}\n" -o /dev/null https://www.baidu.com

    其中-I参数控制输出标头,-s(silent)指定不输出信息,否则会显示花费的时间,速度进度等信息,-w(write-out)以固定特殊的格式输出,上面的%{http_code},就会只输出状态码,-o(output)将服务器的回应保存成文件,上面的/dev/null可以简单理解为linux下面的一个不占空间的垃圾箱,上面的一行代码表示将服务器返回的标头全部舍弃,只返回状态码。

    完整的shell脚本:

echo "status: $(curl -I -s -w "%{http_code}\n" -o /dev/null www.baidu.com)" | mail -s "subject" yours@qq.com

    这将直接把状态码发送到yours@qq.com的邮箱。当然,这个还可以加一点功能,例如判断状态码如果返回200就不用邮件通知了。

    但是,由于一些需求,想要将标头的其它字符串、HTML的标题也一起输入到邮件,所以需要提取响应头的字符串。

    示例:

curl -I -s https://www.baidu.com > test.txt; cat test.txt| grep -E "H|Content-Length"

    由于我不知道如何在shell脚本中将命令输出的文本和grep命令联结起来,所以用了一个笨办法,先将响应信息保存到文本,再利用grep命令的-E参数(extended-regexp,将样式为延伸的正则表达式来使用)从文本中获取指定的字符串所在行。

    最终脚本

#!/bin/bash
# author: zxf
# func: test each webpage from url_list
# return custom parameter by `grep -E`

url_list=(www.baidu.com www.youku.com)
my_subject="Url Status"

temp_file=url_head.txt;
output_file=grep_head.txt;

test_url(){
        for i in ${url_list[*]};
        do
                echo -e "\n${i}" >> "$output_file"; #-e Turn on escaping 
                curl -i -s ${i} > $temp_file; cat $temp_file| grep -E "HTTP/|cf-cache-status|cache-control|<title>" >> $output_file;
        done
}
# run
test_url
# convert to unix but not display any info
dos2unix $output_file > /dev/null 2>&1;
# send mail
cat $output_file | mail -s "$my_subject" yourmail@qq.com
# delete log file
rm -rf $temp_file;
rm -rf $output_file;

    效果如下:

    备注:

    如果你发现使用cat命令怎么也无法发送文档的内容到对方邮箱时,可以尝试看一下文件格式,如果使用touch命令直接在linux系统中创建的文件默认格式是ASCII text,但如果是从windows上传的文件或者在linux中重定向的文件会是ASCII text, with CRLF line terminators,这个可真是个大坑:

file test.txt
dos2unix test.txt

备注:

# curl用法
https://www.ruanyifeng.com/blog/2019/09/curl-reference.html
https://cloud.tencent.com/developer/article/1852376
# dev/null
https://linuxhint.com/what_is_dev_null/
https://blog.csdn.net/wuruixn/article/details/8535378
#grep
https://www.runoob.com/linux/linux-comm-grep.html
# 查看文件格式
https://www.cnblogs.com/yongdaimi/p/12573298.html