版权声明:本文为博主原创文章,转载请指明地址。 https://blog.csdn.net/Mr_rsq/article/details/82019013
目录
案例1
- 开发shell脚本分别实现以定义变量,脚本传参以及read读入的方式比较2个整数大小。用条表达式(不使用if)进行判断并以屏幕输出的方式提醒用户比较结果。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数不对给予提示。
[root@linux-node1 scripts]# cat zonghe.sh
#!/bin/bash
#No.1 read args
read -p "Pls input two int nums:" a b
# The first Judge method.
expr $a + $b + 1 &>/dev/null
[ $? -ne 0 ] && {
echo "Warning: Must two integer args"
exit 1
}
:<<EOF
# The second judge method.
[ "`echo "$1"|sed 's#[^0-9]##g'`" = "$1" ] || {
echo "The first num must be integer."
exit 3
}
[ "`echo "$2"|sed 's#[^0-9]##g'`" = "$2" ] || {
echo "The second num must be integer."
exit 4
}
EOF
[ $a -eq $b ] && {
echo "$a = $b"
exit 0
}
[ $a -gt $b ] && {
echo "$a > $b"
exit 0
}
[ $a -lt $b ] && {
echo "$a < $b"
exit 0
}
[root@linux-node1 scripts]# bash zonghe.sh
Pls input two int nums:2 3
2 < 3
[root@linux-node1 scripts]# bash zonghe.sh
Pls input two int nums:3 2
3 > 2
[root@linux-node1 scripts]# bash zonghe.sh
Pls input two int nums:3 3
3 = 3
[root@linux-node1 scripts]# bash zonghe.sh
Pls input two int nums:2 r
Warning: Must two integer args
案例2
打印菜单,一键安装web服务:
[root@linux-node1 scripts]# bash install.sh
1.[install lamp]
2.[install lnmp]
3.exit
Pls input your choice:
要求:
- 当用户输入1时,输出“start installing lamp.”然后执行
/server/scripts/lamp.sh
。脚本内容输出”Aready installed lamp”后退出脚本; - 当用户输入2时,输出“start installing lnmp.”然后执行
/server/scripts/lnmp.sh
。脚本内容输出”Aready installed lnmp”后退出脚本; - 当输入3时,退出当前菜单及脚本;
- 当输入任何其它字符,给出提示”Input error.”后退出脚本。
- 要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等判断。
脚本:
[root@linux-node1 scripts]# cat install.sh
#!/bin/bash
lamp_path=/server/scripts/lamp.sh
lnmp_path=/server/scripts/lnmp.sh
cat <<END
1.[install lamp]
2.[install lnmp]
3.exit
END
read -p " Pls input your choice:" a
expr $a + 1 &>/dev/null
if [ $? -ne 0 ]; then
echo "Warning: Input must be integer."
exit 1
fi
if [ "$a" == "1" ]; then
[ -f $lamp_path ] && {
echo "Start installing lamp......"
bash $lamp_path &>/dev/null
if [ $? -ne 0 ]; then
echo "Install lamp failed!"
exit 2
else
echo "aready installed lamp."
exit 0
fi
} || echo "Warning: $lamp_path dose not exit"
elif [ "$a" == "2" ]; then
[ -f $lnmp_path ] && {
echo "Start installing lnmp......"
bash $lnmp_path &>/dev/null
if [ $? -ne 0 ]; then
echo "Install lnmp failed!"
exit 3
else
echo "Aready installed lnmp."
exit 0
fi
} || echo "Warning: $lnmp_path dose not exit"
elif [ "$a" == "3" ]; then
exit 0
else
echo "Input error!"
exit 4
fi
# 测试
[root@linux-node1 scripts]# bash install.sh
1.[install lamp]
2.[install lnmp]
3.exit
Pls input your choice:
3
[root@linux-node1 scripts]# echo $?
0
[root@linux-node1 scripts]# bash install.sh
1.[install lamp]
2.[install lnmp]
3.exit
Pls input your choice:
1
Start installing lamp......
aready installed lamp.
[root@linux-node1 scripts]# bash install.sh
1.[install lamp]
2.[install lnmp]
3.exit
Pls input your choice:
2
Start installing lnmp......
Aready installed lnmp.
[root@linux-node1 scripts]# echo $?
0
[root@linux-node1 scripts]# bash install.sh
1.[install lamp]
2.[install lnmp]
3.exit
Pls input your choice:
e
Warning: Input must be integer.
# 把lamp.sh的脚本删掉后执行测试
[root@linux-node1 scripts]# bash install.sh
1.[install lamp]
2.[install lnmp]
3.exit
Pls input your choice:1
Warning: /server/scripts/lamp.sh dose not exit
# 在上边的脚本初始化提示的时候可以有第二种办法,写函数,然后调用
[root@linux-node1 scripts]# cat menu.sh
menu() {
cat <<END
1.[install lamp]
2.[install lnmp]
3.exit
Pls input your choice:
END
}
menu
[root@linux-node1 scripts]# bash menu.sh
案例3
- 开发shell脚本判断系统剩余内存的大小,如果低于100M就给邮件报警给管理员,并且加入系统定时任务每3分钟执行一次检查。
# 下边的脚本只是测试用,要实现邮件还要配置一些文件
#!/bin/bash
mail_address=960503480@qq.com
mem=`free -m|awk 'NR==2{print $4}`
echo "$mem" >/var/mem
if [ $mem -le 100 ];then
mail -s "mem warning!" $mail_address </var/mem
exit 0
else
echo "mem in control."
exit 0
fi
案例4
- 用if双分支实现对nginx或mysql服务是否正常判断,使用进程数、端口、URL的方式判断,如果进程没起来,把进程启动。
#!/bin/bash
if [ `netstat -lntup|grep mysqld|wc -l` -ge 1 ]
then
echo "Mysql service is running......"
else
echo "Mysql service is stop."
/etc/init.d/mysqld start
fi
查看远端的端口是否通畅3个简单实例案例:
http://blog.51cto.com/oldboy/942530
[root@linux-node1 scripts]# nmap www.baidu.com -p 80|grep open|wc -l
1
[root@linux-node1 scripts]# echo -e "\n"|telnet www.baidu.com 80|grep Connected|wc -l
Connection closed by foreign host.
1
对于mysql服务来讲,可用netstat、ps、lsof等命令取出端口对比来达到监控服务的功能。需注意以下两点:
- 要用字符串比较
- 在写脚本的时候,如果过滤内容为mysql那么脚本名字尽量不要带mysql的字符
对于web服务来说监控服务
- 除了上述监控mysql的方式外还可以用:wget/curl(http方式,判断根据返回值或者返回内容,如200/301/302代表正常的页面返回状态码)
[root@RSQ ~]# curl -I www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 277
Content-Type: text/html
Date: Fri, 24 Aug 2018 05:46:17 GMT
Etag: "575e1f8a-115"
Last-Modified: Mon, 13 Jun 2016 02:50:50 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
[root@RSQ ~]# curl -I www.baidu.com|awk 'NR==1{print $2}'>1.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 277 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
200
[root@RSQ ~]# cat 1.txt # 除了200外其它信息不会被输出
200
案例5
- 监控web站点目录(/var/html/www) 下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次(10分钟时间完成)。
解答:
- 首先,思想过程更重要。
- 什么是恶意篡改,只要未经过许可改动的都是篡改。
- 文件被改了,会有特征。
a. 大小可能会变化。
b. 修改时间会变化,(文件测试符ot,nt)
c. 文件内容会变化,md5sum指纹
d. 增加或删除文件
find /var/www/html -type f |xargs md5sum >/tmp/md5list
[root@RSQ ~]# mkdir -p /var/www/html
[root@RSQ ~]# touch /var/www/html/{a..k}
[root@RSQ ~]# ls /var/www/html
a b c d e f g h i j k
[root@RSQ ~]# find /var/www/html -type f |xargs md5sum >/tmp/md5list
[root@RSQ ~]# cat /tmp/md5list
d41d8cd98f00b204e9800998ecf8427e /var/www/html/h
d41d8cd98f00b204e9800998ecf8427e /var/www/html/d
d41d8cd98f00b204e9800998ecf8427e /var/www/html/f
d41d8cd98f00b204e9800998ecf8427e /var/www/html/b
d41d8cd98f00b204e9800998ecf8427e /var/www/html/k
d41d8cd98f00b204e9800998ecf8427e /var/www/html/c
d41d8cd98f00b204e9800998ecf8427e /var/www/html/i
d41d8cd98f00b204e9800998ecf8427e /var/www/html/a
d41d8cd98f00b204e9800998ecf8427e /var/www/html/e
d41d8cd98f00b204e9800998ecf8427e /var/www/html/j
d41d8cd98f00b204e9800998ecf8427e /var/www/html/g
# 用md5sum测试文件是否有问题
[root@RSQ ~]# md5sum -c /tmp/md5list
/var/www/html/h: OK
/var/www/html/d: OK
/var/www/html/f: OK
/var/www/html/b: OK
/var/www/html/k: OK
/var/www/html/c: OK
/var/www/html/i: OK
/var/www/html/a: OK
/var/www/html/e: OK
/var/www/html/j: OK
/var/www/html/g: OK
# 修改文件后检测
[root@RSQ ~]# echo 1111 > /var/www/html/a
[root@RSQ ~]# md5sum -c /tmp/md5list
/var/www/html/h: OK
/var/www/html/d: OK
/var/www/html/f: OK
/var/www/html/b: OK
/var/www/html/k: OK
/var/www/html/c: OK
/var/www/html/i: OK
/var/www/html/a: FAILED
/var/www/html/e: OK
/var/www/html/j: OK
/var/www/html/g: OK
md5sum: WARNING: 1 of 11 computed checksums did NOT match
故在此基础上我们可以写个脚本来监控目录中是否有文件被篡改,我把发邮件的给注释掉了
[root@RSQ scripts]# cat monitor.sh
#!/bin/bash
Path=/var/www/html
md5file=/tmp/md5list
md5check_safety=/tmp/md5check_safety
md5check_failed=/tmp/md5check_failed
check_result=`md5sum -c $md5file |grep FAILED|wc -l`
if [ $check_result -eq 0 ]; then
echo "$(date +%F) $Path is security." >>$md5check_safety
# mail -s "md5check result" "[email protected]" <$md5check_safety
else
echo "$(date +%F) $Path was changed." >>$md5check_failed
# mail -s "md5check result" "[email protected]" <$md5check_failed
fi
# 在上边实验的基础上我们来测试
[root@RSQ scripts]# cat /tmp/md5check_failed
2018-08-24 /var/www/html was changed.