shell关于邮箱的脚本与应用

题目一
【shell要求】
要求:两类机器一共300多台,写个脚本自动清理这两类机器里面的日志文件,
在堡垒机上发布,也要批量发布到crontab里面,
A类机器日志存放路径很同一,B类机器日志文件存放路径需要用匹配(因为这个目录
除了日志外,还有其他文件,不能删除,匹配的时候看用
.log)
A类:/opt/cloud/log/
删除7天前日志
B类:/opt/cloud/instances/删除15天前日志
不用考虑堡垒机上的操作,只要写shell脚本就可以。
【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
b=/opt/cloud/log/
c=/opt/cloud/instances
if [ -d $b ];then
for l in `find $b -mtime +2`      #为了方便执行结果这里用删除两天的日志文件
do
rm -rf $l
done
elif [ -d $c ];then
for k in `find $k -mtime +5`
do
rm -rf $k
done
fi

或者我们用第二种方法这里需要用到一个过滤器软件xargs以下简单的介绍下
【shell解析】
1、脚本写出来没有想象那么复杂,只需要分别判断两个目录是否存在,然后分别执行find和rm操作。
2、关与find -mtime这个参数的使用规则
##mtime参数的理解应该如下###
-mtime n按照文件的更改时间来找文件,n为整数。
n 表示文件更改时间距离为天,-n表示文件更改时间距离为n天以内,+n表示文件更改时间距离在n天以前
例如:
-mtime 0表示文件修改时间距离为0天的文件,即距离当前时间不到1天(24小时)以内的文件
-mtime 1表示文件修改时间距离为1天的文件,即距离当前时间1天(24小时-48小时)的文件
-mtime+1表示文件修改时间为大于1天的文件,即距离当前时间2天(48小时)之外的文件
-mtime -1表示文件修改时间为小于1天的文件,即距离当前时间1天(24小时)之内的文件
3、xargs是给命令传递参数的在这里插入代码片一个过滤器,也是组合多个命令的一个工具。
xargs可以将管道布偶足额标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs默认的命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,
不过通过xargs的处理,换行和空白将被空格取代。
xargs是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就
有了xargs命令,例如:

find /sbin -perm +700 |ls -l             #这个命令是错误的
find /sbin -perm +700 |xargs ls -l      #这样才是正确的

下面是实验

#!/bin/bash
dir1=/opt/cloud/instances/
dir2=/opt/cloud/log/
if [ -d $dir1 ];then
  find $dir1 -type f -name "*.log" -mtime +3 |xargs rm -rf    
##-type f -name “*.log”意思是类型文件是以所有的以.log结尾的
elif [ -d $dir2 ];then
  find $dir2 type f -mtime +2 |xargs rm -rf
fi

进行测试的文件可以之间去创建然后常见的时间可以是自定义的

cd/opt/cloud/
rm-rf *      ##先删除之前自己 could里面的所有文件
cd/opt/cloud/log
touch -t 202003171212 {
    
    1..30}.txt   ##创建三月的文件
touch -t 202003171212 {
    
    1..30}.log   ##这个文件是和上面的文件做对比用的
/opt/rmlog.sh

题目二:
题目要求:
写一个shell脚本,通过curl -I 返回状态码来判定所访问的网站是
否正常,比如当代码状态200,才算正常
写一个发邮件的脚本
习题分析:
1、关键问题,截取出代码状态
2、在写出该shell脚本时,应该先在命令下面使用curl -I http://www.51xit.top/命令测试,然后通过awk截取到状态码
3、写发邮件的脚本,用的是sendEmail。生产环境有配套的模板
4、判断和发邮件关联
curl -I http://www.51xit.top/
我们抓包会有交互信息 200
答案
首先我们要去下载邮箱的软件包并自行的去解压,安装这里的包源可以自己去网上下载
解压安装的命令是
【安装邮件组件】

wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
`tar -zxvf sendEmail-v1.56.tar.gz``
cp sendEmail-v1.56/sendEmail /usr/local/bin/
chmod 755 /usr/local/bin/sendEmail
vi /opt/sendEmail.sh
#下面是编辑知己的邮箱
#!/bin/bash
 #Filename:    SendEmail.sh
 #Revision:    1.0
# Date:        2019/05/29
# Author:      Qicheng
# Email:
# Website:     http://51xit.top/
# Description: tang邮件告警脚本
# Notes:       使用sendEmail
LOGFILE="/tmp/Email.log"
:>"$LOGFILE"
exec 1>"$LOGFILE"
exec 2>&1
SMTP_server='smtp.qq.com'           
username='[email protected]'       # SMTP服务器,变量值需要自行修改  (这里做题的时候就可以直接复制了)
password='zjckyfgqtdggbej'    # 密码(QQ邮箱用的是授权码),变量值需要自行修改 
from_email_address='[email protected]'   ## 发件人Email地址,变量值需要自行修改
to_email_address="$1"     # 收件人Email地址,tang传入的第一个参数
message_subject_utf8="$2"        # 邮件标题,tang传入的第二个参数
message_body_utf8="$3"      # 邮件内容,tang传入的第三个参数
# 转换邮件标题为GB2312,解决邮件标题含有中文,收到邮件显示乱码的问题
message_subject_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_subject_utf8
EOF`
[ $? -eq 0 ] && message_subject="$message_subject_gb2312" || message_subject="$message_subject_utf8"
# 转换邮件内容为GB2312,解决收到邮件内容乱码

message_body_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_body_utf8
[ $? -eq 0 ] && message_body="$message_body_gb2312" || message_body="$message_body_utf8"
# 发送邮件
sendEmail='/usr/local/bin/sendEmail'
set -x
$sendEmail -s "$SMTP_server" -xu "$username" -xp "$password" -f "$from_email_address" -t "$to_email_address" -u "$message_
subject" -m "$message_body" -o message-content-type=text -o message-charset=gb2312`

这个题答案是

vi/opt/123.sh
#/bin/bash
url='www.51xit.top'        ####这里可以改为www.baidu.com
sta= 'curl -I $url 2>/dev/null |head -1|awk "{print $2}”
if [ $sta!= "200"]        ###这里的!表示不等于200的时候发邮件一般情况网路正常返回值就是200
then
/opt/sendEmail.sh [email protected] "$url down." "$url down."
fi

习题三:
【shell要求】
用shell写一个内存监控脚本,使用超过80%并发邮件告警
【shell思路】
1、思路:free
free -m
##Mem:内存的使用情况总览表。
##totel:机器总的物理内存 单位为:M
##used:用掉的内存。
##free:空闲的物理内存。
2、算取百分比
3、比对做出判断
下面是这个题的答案

#!/bin/bash
a=$(free -m |grep 'M' |awk '{print $3}')                                 ##过滤出使用的内存的请况
b=$(free -m |grep 'M' |awk '{print $2}')                                ##过滤一共有的内存的情况
let m=$a*100/$b                                                                     #因为不能为小数,所以必须要先乘100即简单了
echo "内存使用情况为:"$m%
if [ $m -gt 10 ]                                                                     #注意这里中括号与内容必须有空格
then
  sh /opt/sendEmail.sh [email protected].com "报警" "内存使用情况$m%.报警" 
fi

还有一种方法可以让脚本执行状态下一直监控着内存情况

#!/bin/bash
i=0
while [ $i -eq 0 ]                               #这里也可以将上面的去掉然后直接换成i=0后面的while直接跟trunk就可以
do
a=$(free -m |grep 'M' |awk '{print $3}')
b=$(free -m |grep 'M' |awk '{print $2}')
let m=$a*100/$b
echo "内存使用情况为:"$m%
if [ $m -gt 10 ]
then
  sh /opt/sendEmail.sh [email protected].com "报警" "内存使用情况$m%.报警"
fi
sleep 300              #设置5分钟发一次
done

猜你喜欢

转载自blog.csdn.net/Laiyunpeng666/article/details/108243577