Shell脚本综合实战案例

前言

实验环境

VMware Workstation 15

centos7虚拟机若干台

1.案例一:

1.需求描述

1.1编写名为system.sh的小脚本,记录局域网中各主机的MAC地址,保存到/etc/ethers文件中;若是文件已存在,应先转移进行备份;每行一条记录,第一列为IP地址,第二列为对应的MAC地址

1.2检查有哪些主机开启了FTP服务,扫描对象为/etc/ethers文件中所有的IP地址,扫描的端口为21

2.命令测试

2.1分析:

记录局域网中个主机的MAC地址,保存到/etc/ethers文件中;若此文件已经存在,应先转移进行备份;检查有哪些主机开启了FTP服务,扫描对象为/etc/ethers文件中的所有的IP地址,扫描的端口为21

2.2arping -c 2 -w 1 ip: 发送MAC地址解析请求

2.3arp -n:记录MAC

2.4awk:打印ip与MAC地址

2.5使用nmap端口扫描方法测试FTP服务

3.脚本编程与调试

3.1通过arping命令发送ARP请求,使用if语句根据反馈结果记录MAC地址

3.2通过awk命令过滤出/etc/ethers文件中的所有IP地址,重复探测ftp的开启情况

4.需求实现

4.1查看局域网中主机对应的的MAC地址

arping -c 2 -w 1 -I ens33 192.168.73.132
-c 发送包的数量
-w 最长等待时间
-I 指定arping测试的网卡设备

命令测试的结果:

[root@localhost opt]# arping -c 2 -w 1 -I ens33 192.168.73.132
ARPING 192.168.73.132 from 192.168.73.133 ens33
Unicast reply from 192.168.73.132 [00:0C:29:93:7A:63]  1.547ms
Unicast reply from 192.168.73.132 [00:0C:29:93:7A:63]  0.906ms
Sent 2 probes (1 broadcast(s))
Received 2 response(s)
//我们需要的信息:192.168.73.132 [00:0C:29:93:7A:63]
//上面是成功的,下面我们展示不成功的
[root@localhost opt]# arping -c 2 -w 1 -I ens33 192.168.73.130
ARPING 192.168.73.130 from 192.168.73.133 ens33
Sent 2 probes (2 broadcast(s))
Received 0 response(s)
//没有重要的信息

4.2我们用grep语句过滤Unicast开头的这一行

[root@localhost opt]# arping -c 2 -w 1 -I ens33 192.168.73.132 |grep "^Unicast"
Unicast reply from 192.168.73.132 [00:0C:29:93:7A:63]  1.776ms
Unicast reply from 192.168.73.132 [00:0C:29:93:7A:63]  0.812ms
//有我们需要的信息

4.3我们用sed工具来将[]删除掉

[root@localhost opt]# arping -c 2 -w 1 -I ens33 192.168.73.132 |grep "^Unicast"| sed -n "s/\[//p"    //先删除[的这个括号
Unicast reply from 192.168.73.132 00:0C:29:93:7A:63]  1.362ms
Unicast reply from 192.168.73.132 00:0C:29:93:7A:63]  1.170ms
[root@localhost opt]# arping -c 2 -w 1 -I ens33 192.168.73.132 |grep "^Unicast"| sed -n "s/\[//p" |sed -n "s/\]//p"    //再删除]这个括号
Unicast reply from 192.168.73.132 00:0C:29:93:7A:63  0.841ms
Unicast reply from 192.168.73.132 00:0C:29:93:7A:63  0.967ms

4.4我们用awk工具来筛选出ip地址和MAC地址

[root@localhost opt]# arping -c 2 -w 1 -I ens33 192.168.73.132 |grep "^Unicast"| sed -n "s/\[//p" |sed -n "s/\]//p" | awk '{print $4,$5}'
192.168.73.132 00:0C:29:93:7A:63
192.168.73.132 00:0C:29:93:7A:63

4.5我们来判断/etc/ethers这个文件是否存在

[root@localhost opt]# vim system.sh 
#!/bin/bash
if [ ! -f /etc/ethers ]
    then
        touch /etc/ethers
else
    mv /etc/ethers /etc/ethers.bak
    touch /etc/ethers
fi

4.6将arping命令放入循环中,来实现对该局域网中所有主机的ip地址与mac地址的对应关系,并将之写入/etc/ethers文件夹中。

[root@localhost opt]# vim system.sh 
#!/bin/bash
if [ ! -f /etc/ethers ]
    then
        touch /etc/ethers
else
    mv /etc/ethers /etc/ethers.bak
    touch /etc/ethers
fi
for ((j=1;j<=254;j++))
do
    arping -c 2 -w 1 -I ens33 192.168.73.$j |grep "^Unicast"|sed -n "s/\[//p" |sed -n  "s/\]//p" | awk '{print $4,$5}' | uniq  >> /etc/ethers
done

4.7我们可以用另一种方法来实现,用nmap工具来扫描已开启的主机是否开启了ftp,我们知道ftp的端口号为21。

[root@localhost opt]# vim system.sh
#!/bin/bash
if [ ! -f /etc/ethers ]
    then
        touch /etc/ethers
else
    mv /etc/ethers /etc/ethers.bak
    touch /etc/ethers
fi
for ((j=1;j<=254;j++))
do
    arping -c 2 -w 1 -I ens33 192.168.73.$j |grep "^Unicast"|sed -n "s/\[//p" |sed -n  "s/\]//p" | awk '{print $4,$5}' | uniq  >> /etc/ethers
done
ipconnections=`awk '{print $1}' /etc/ethers`
for i in $ipconnections
do

    echo "$i" >> /opt/duankou.txt | nmap -sT $i | grep "21" >> /opt/duankou.txt
done

4.8我们给予这个system.sh这个文件可执行的权限。

[root@localhost opt]# chmod +x system.sh 

4.9我们执行这个脚本来看看结果

[root@localhost opt]# ./system.sh

由于需要arping测试的主机太多,我们需要等待一段时间

4.10我们来查看一下/etc/ethers

[root@localhost opt]# cat /etc/ethers
192.168.73.1 00:50:56:C0:00:08
192.168.73.2 00:50:56:F5:0C:AE
192.168.73.132 00:0C:29:93:7A:63
192.168.73.254 00:50:56:F6:D3:17

4.11再来看看/opt/duankou.txt

[root@localhost opt]# cat /opt/duankou.txt 
192.168.73.1
192.168.73.2
192.168.73.132
192.168.73.254

这个结果表示局域网中的主机没有开启ftp服务,所以我们没法进行ftp文件传输。

2.案例二

1.企业环境说明

某公司随着业务的不断发展,所使用的的Linux服务器也越来越多。管理员希望编写一个简单的性能的监控脚本,放到服务器的红,当监控指标出现异常时放出警告邮件

2.需求描述

2.1编写名为sysmon.sh的Shell监控脚本

2.2监控内容包括CPU使用率、内存使用率、根分区的磁盘占用率

2.3百分比只需要精确到个位,如7%、12%、23%等

2.4出现以下任一情况时警告:磁盘占用率超过90%、CPU使用率超过80%、内存使用率超过90%,警告邮件通过mail命令发送到指定邮箱

2.5结合crond服务,每半小时执行一次监控脚本

3.思路与命令测试

3.1分析

监控内容包括CPU使用率、内存使用率、根分区的磁盘占用率

3.2df命令

3.3awk命令

3.4mpstat 命令(需要安装sysstat)

3.5free命令

3.6crontab命令

4.脚本编程与调试

4.1使用df命令提取根分区的磁盘占用率,赋值给变量DUG

4.2使用mpstat命令提取CPU使用率,赋值给变量DUG

4.3使用free命令提取出内存使用率,赋值给变量MUG

4.4使用if语句判断上述监控项目是否超标,将需要警告的信息保存到/tmp/alert.txt文件;若存在则作为警告邮件发送

4.5调试优化并设置crontab计划

5.程序代码

[root@python opt1]# cat sysmon.sh 
#!/bin/bash
DUG=`df | grep "/$" |awk '{print $5}'|sed -n 's/%//p'`
a=`free | grep "Mem" |awk '{print $3,$2}' | awk {'print $1}'`
b=`free | grep "Mem" |awk '{print $3,$2}' | awk {'print $2}'`
MUG=`expr $a \* 100 / $b `
c=`mpstat |tail -1|awk '{print $12}'|awk -F. '{print $1}'`
CUG=`expr 100 - $c`
if [ $DUG -gt 90 ]
    then
        echo "磁盘的使用率超过90了。请尽快添加磁盘" >> /tmp/alert.txt
fi
if [ $MUG -gt 90 ]
    then
	echo "内存使用的使用情况超过了90了,请尽快添加内存" >> /tmp/alert.txt
fi
if [ $CUG -gt 80 ]
    then
	echo "CPU的使用率超过了80,请尽快添加CPU" >> /tmp/alert.txt
fi
if [ -f /tmp/alert.txt ]
  then
	     cat /tmp/alert.txt | mail -s "警告" root@python
         rm -rf /tmp/alert.txt
fi

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐