例51.判断网站是否正常
要求:写一个shell脚本,通过curl -l 返回的状态码来判定所访问的网站是否正常
比如,当状态码是200时才是正常
要点:
curl -l curl
如何截取状态码
#!/bin/bash
url="http://apelearn.com/index.php"
#mail_user=123456@qq.com
code=`curl -I Rurl 2>/tmp/curl.err |head -1 |awk '{print $2}'`
if [ -z "$code" ]
then
python mail.py $mail_user "usr访问异常" "`cat /tmp/curl.err`"
exit
elif [ $code != "200" ]
then
curl -I $url &> /tmp/curl.log
python mail.py $mail_user "usr访问异常,状态码$code" "/tmp/curl.log"
f
例52 小于5K的文件打包
要求:将用户家目录(考虑到执行脚本的用户可能是普通用户也可能是root)下面小于5k的文件打包成tar.gz的压缩包,并以当前日期为文件名前缀,例如 2018-03-15.tar.gz
要点:find ./ -type -f -size -5k
date+%F
#!/bin/bash
#这个脚本用来打包用户家目录下小于5k的文件
t=`date +%F`
cd $HOME
tar czf $t.tar.gz `find ./ -type f -size -5k | xargs`
例53 监控22端口是否被封
要求:一个同学不小心用iptables规则把sshd端口22给封掉了,结果不能远程登录,想要解决这问题,还要去机房,登录真机去删除这规则。问题来了,要写个监控监本,监控iptables规则是否封掉了22端口,如果封掉了,给打开。写好脚本,放到计划任务里,每分钟执行一次
要点:如何判定是否封掉22端口是本题的关键点
思路是查看iptables INPUT链规则,看是否有目标端口为22的规则,并且规则target为DROP或者REJECT
#!/bin/bash
iptables -nvL INPUT --line-numbers | grep -w 'dpt:22' | awk '$4 ~/REJECT|DROP/ {print $1}' >
/tmp/iptables.log
n=`wc -l /tmp/iptables.log`
if [ $n -gt 0 ]
then
for n in ` tac /tmp/iptables.log`
do
iptables -D INPUT $n
done
fi
例54 分析日志
要求:已知nginx访问日志文件在/usr/local/nginx/logs/access.log内,请统计早上10点到12点来访IP最多的是那个
要点
需要截取10点到12点之间的日志,思路使用grep过滤时间关键字
请求的IP在日志第一段用awk截取即可
#!/bin/bash
log="/usr/local/nginx/logs/access.log"
t=`date +%d/%b/%Y:1[01]:[0-5][0-9]:`egerp "$t" $log|awk '{print $1} | sort -n | uniq -c | sort -n | tail -1 | awk '{print $2}''
例55 打印数字
要求:写一个shell脚本。提示输入一个暂停的数字,然后从1打印到该数字,然后询问是否继续,继续的话就再输入一个数字接着打印,否则退出脚本
例:如果输入的是5,打印12345,然后继续输入14,然后打印6 7。。。14 15 以此类推
核心
1.根据题目要求,首先用read -p 提示用户输入数字,获取到第一个数字
2.此时需要判断用户输入的是否是纯数字
3.第一次循环后,若用户继续输入数字,此时不仅要判断输入的是否是纯数字,还要判断输入的数字是否比第一个数字大
#!/bin/bash
read -p "Please input a number:" n
n1=`echo $n | sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo " Please input a nubmer"
exit
fi
for i in ` seq 1 $n`
do
echo $i
done
read -p " If continue y/n:" c
case $c in
n|N)
exit
;;
y|Y)
read -p "Pleease input a number: " n2
n3=`echo $n2|sed 's/[0-9]//g'`
if [ -n "$n3" ]
then
echo "Please input a number."
exit
fi
if [ $n2 -le $n ]
then
echo "$n2 should grater than $n."
exit
fi
for i in ` seq $[$n+1] $n2`
do
echo $i
done
;;
*)
echo "Please input y or n."
;;
esac