(三)Shell简单案例

版权声明:本文为博主原创文章,转载请指明地址。 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. 当用户输入1时,输出“start installing lamp.”然后执行/server/scripts/lamp.sh。脚本内容输出”Aready installed lamp”后退出脚本;
  2. 当用户输入2时,输出“start installing lnmp.”然后执行/server/scripts/lnmp.sh。脚本内容输出”Aready installed lnmp”后退出脚本;
  3. 当输入3时,退出当前菜单及脚本;
  4. 当输入任何其它字符,给出提示”Input error.”后退出脚本。
  5. 要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等判断。

脚本:

[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等命令取出端口对比来达到监控服务的功能。需注意以下两点:

  1. 要用字符串比较
  2. 在写脚本的时候,如果过滤内容为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分钟时间完成)。

解答:

  1. 首先,思想过程更重要。
  2. 什么是恶意篡改,只要未经过许可改动的都是篡改。
  3. 文件被改了,会有特征。
    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.

猜你喜欢

转载自blog.csdn.net/Mr_rsq/article/details/82019013