shell!!运维岗实用脚本示例

shell实用实验

实验1

实验要求:

两类机器一共300多台,写个脚本自动清理这两类机器里面的日志文件,
在堡垒机上发布,也要批量发布到crontab里面,
A类机器日志存放路径很同一,B类机器日志文件存放路径需要用*匹配(因为这个目录除了日志外,还有其他文件,不能删除,匹配的时候看用*.log)

A类:/opt/cloud/log/ 删除7天前日志
B类:/opt/cloud/instances/ 删除15天前日志

不用考虑堡垒机上的操作,只要写shell脚本就可以。

实验分析

1、需要写出一个通用脚本,也就是说该脚本无论是放到A类机器还是B类机器都可以运行
2、所以需要判断是A类还是B类机器,可以用过判断目录/opt/cloud/log或者/opt/cloud/instances目录的存在与否来确定是哪类机器。
3、对于A类机器直接find即可,而B类机器需要find -name "*.log"稍微繁琐
4、找find哪天之前的参数,
5、日志文件找好后,传递给rm删除,用到一个命令?

#!/bin/bash
A=/opt/cloud/log/
B=/opt/cloud/instances/
if [ -d $A ]
then
for l in `find $A -mtime +7`  //find 结合-mtime选项可以查找出几天前改动的文件
do
rm -rf $l
done
elif [ -d $B ]
then
for I in `find $B -mtime +15 -name "*.log"`
do
rm -rf $I
done
fi

find选项补充:
-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项,但它们都和-mtime选项
相似,所以我们在这里只介绍-mtime选项。

实验2

实验要求:

每隔5分钟检查指定的用户是否登录系统,用户名从命令行中输入
如果指定的用户已登录,则显示相关的信息。

实验分析:

1、每隔5分钟,可用计划任务,也可以做死循环
2、根据题目要求,用户名要求输入,那就意味着和用户交互,如果每5分钟都去交互一次,太麻烦了,所以死循环比较合适,只需要交互一次
3、who和users命令可以查看当前登录系统的用户名列表用grep -w保证匹配的用户更加精确
4、在while死循环之前,先让用户输入用户名,如果在循环里面,那每隔5分钟,都要输入一次用户名,这样不合理

#!/bin/bash
read -p "监测用户:" USER
while :  //“:”为空命令,返回值为0,作用于true相似
do
if users |grep -w $USER
then
echo "用户$USER在线"
else
echo "用户$USER不在线"
fi
sleep 300  //休眠时间,暂停时间,默认单位秒
done

实验3

实验要求

目前项目上线,有这样的需求,为了不让上线的服务器,不与线网的IP地址相冲突,要求写出一个shell脚本,把192.168.100.0/24网段在线的IP地址和不在线的IP地址列出来,并且保存到文档中。

实验分析

1、24网段公有254个IP地址,从192.168.100.1到192.168.100.254,需要以个for循环进行遍历。
2、看一个IP地址是否在线,主要用ping命令来进行测试。

#!/bin/bash
#rm -rf /var/log/ipup.txt /var/log/ipdown.txt &>/dev/null  //将原本存放ip在线信息的文件删除(防止重复执行产生的垃圾内容)也可以采用sort和uniq来过滤
for ((i=1; i<=4; i++))
do
ip="20.0.0.$i"
ping -c 2 -i 0.2 -W 2 $ip &>/dev/null 
if [ $? -eq 0 ]
then
echo "$ip不可以用" >>/var/log/ipup.txt
else
echo "$ip可用" >>/var/log/ipdown.txt
fi
done
#################过滤掉文件中重复的部分############################
cat /var/log/ipup.txt |sort |uniq >/var/log/ipupbak.txt
rm -rf /var/log/ipup.txt
mv /var/log/ipupbak.txt /var/log/ipup.txt

ping命令补充:
-c :count 在发送(和接收)了正好数量为 count 的回显应答分组后停止操作。在发送了 count 个分组后没有收到任何分组的特别情况是发送导致了终止(选程主机或网关不可达)。即发出的测试包数目
-i : wait 在发送每个分组时等待 wait 个秒数。缺省值为每个分组等待一秒。此选项与-f选项不能同时使用。每次发出测试包的间隔时间
-n :只以数字形式输出信息。这样就不尝试去查找主机名了。
-t :设置存活数值TTL的大小-v
-w :waitsecs 在 waitsecs 秒后停止 ping 程序的执行。当试图检测不可达主机时此选项很有用。

猜你喜欢

转载自blog.csdn.net/CN_LiTianpeng/article/details/108220925