• 兄弟连 企业shell笔试题 1-15


    这些题目收集自网络,对比原来的答案,又根据实际情况重新编写了自己的答案

    企业实践题1:

    (生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:
    阶段1:开发一个守护进程脚本每30秒实现检测一次。
    阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。

    阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)

    重点语句分析
    mysql查看状态语句  

    mysql>show slave statusG
    *************************** 1. row ***************************

                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 10.0.0.42
                      Master_User: backup
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 538
                   Relay_Log_File: mysql-relay-bin.000002
                    Relay_Log_Pos: 701
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes


    使用MysqlCmd2 命令筛选后语句:

    Yes
    Yes
    0
    0
    it

    #!/bin/bash
    
    port=3306
    error=(1158 1159 1008 1007 1062)
    MysqlCmd1= mysql -uroot -p192.168.51.9 -e
    MysqlCmd2= mysql -uroot -p192.168.51.9 -e"show slave statusG"|egrep "_Running|Last_Errno|Behind_Master"|awk '{print $NF}'
    
    function is_run(){
     [ `lsof -i:$port|wc -l` -lt 2 ]&&{
     echo"mysql is stop"
     exit 1
     }
    }
    
    
    function mysql_status(){
     array=(`$MysqlCmd2`)
     }
    
    
    function judge_error(){
    for i in ${error[*]}
    do 
      if [ "${array[2]}" == "$i" ];then
       $MysqlCmd1"stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;start slave;"
      else
       echo "mysql is failed,error id is ${array[2]}"
      fi
    done
    }
    
    judge_status(){
    mysql_status
    echo ${array[*]}
    if [ "${array[0]}" == "Yes" -a "${array[1]}" == "Yes" -a "${array[3]}" == "0" ];then
        echo "Mysql slave is ok"
    else
        judge_error ${array[2]}
    fi
    }
    
    
    function main(){
    while true
     do
       is_run
       judge_status
       sleep 30
     done
    }
    
    
    main
    View Code

     

    企业实践题2:
    使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:

    coaolvajcq_oldboy.html  qnvuxvicni_oldboy.html

    重点语句分析:
    #tr -dc 的意思是,将字符串中a到z 以外的字符提取并删除,只保留小写字母

    #!/bin/bash
    dir=/oldboy
    [ ! -d $dir ] && mkdir -p $dir

    for((i=1;i<=10;i++ )) do a=`tr -dc "a-z" < /dev/urandom | head -c 10`_oldboy,html touch $dir/$a done

     

    企业实践题3:
    请用至少两种方法实现!
    将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。

    重点语句分析:
    sed 's/A/B/g' 将A替换为B

    awk -F '_'  以_为分解符

    #!/bin/bash
    cd /root/oldfile
    
    for a in `ls`
    do
     b=`echo $a|sed 's/oldboy.html/oldgirl.HTML/g'`
     mv $a $b
    done
    #!/bin/bash
    cd /root/oldfile
    
    for a in `ls`
    do
     b=`echo $a|awk -F '_' '{print $1}' `
     mv $a $b_oldgirl.HTML
    done

    企业实践题4:
    批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)

    #!/bin/bash
    
    for ((i=1;i<=10;i++ ))
    do
      a=`cat /dev/urandom | head -n 1 |md5sum| head -c 8`
      useradd -p $a oldboy$i >> ./user_pass
    done 

    企业面试题5:
    写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多)

    重点语句分析:
    shell中使用 let进行数字计算
    #!/bin/bash
    ip=10.0.0.
    declare -i success=0
    declare -i down=0
    
    for a in `seq 1 254`;do
      ping -c 1 "$ip$a" >/dev/null 2>&1
     if [ "$?" -eq 0 ];then
       echo "$ip$a is up"
       let success+=1
     else
       echo "$ip$a is down"
       let down+=1
     fi
    done
    
    echo success:$success fail:$down

    企业实战题6:
    请用至少两种方法实现!

    写一个脚本解决DOS攻击生产案例
    提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。
    防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP。

    方法1:
    设定触发条件 为并发连接数 达到100 即封掉ip

    重点语句分析
    先输出所有建立连接的ip地址,从大到小进行排序
    netstat -an|grep ESTABLISHED|awk -F '[: ]+' '{print $6}' |sort|uniq -c|sort -nr    

    如果netstat输出带有ipv6的   ::ffff:  字符串,用这个改进过的语句进行过滤
    netstat -an|grep ESTABLISHED|awk '{print $5}'|sed 's/::ffff://g'|awk -F: '{print $1}'|sort|uniq -c|sort -nr
    输出结果

    210 10.11.0.78
    100 61.158.175.44
    100 42.234.11.172
    91 221.13.156.210
    81 10.11.0.79
    21 10.0.7.99

     

     顺序执行

    #!/bin/bash
    while true
    do
     netstat -an|grep ESTABLISHED|awk -F '[: ]+' '{print $6}'|sort|uniq -c|sort|while read line
       do
         ip=`echo $line|awk '{print $2}'`
         count=`echo $line|awk '{print $1}'`
         if [ "$count -ge 100 ] && [ `iptables -L -n|grep "$ip"|wc -l` lt 1 ];then
          iptables -I INPUT -s "$ip" -j DROP
         echo $ip is DROP >> drop_list.log
        # fi
       done
    sleep 60
    done

     设计为函数

    #!/bin/bash
    
    log=/tmp/ipdos.log
    [ -f $log ] || touch $log
    
    add_iptables(){
    while read line
    do
     ip=`echo $line|awk '{print $2}'`
     count=`echo $line|awk '{print $1}'`
        if [ "$count" -ge 100 ] && [ `iptables -L -n|grep "$ip"|wc -l` lt 1 ];then
         iptables -I INPUT -s "$ip" -j DROP
        echo $ip is DROP
        fi
    done < $log
    }
    
    main(){
    while true
    do
     netstat -an|grep ESTABLISHED|awk -F '[: ]+' '{print $6}'|sort|uniq -c|sort > $log
     add_iptables
     sleep 60
    done
    }
    
    main



     方法2:
    设定触发条件 为过去三分钟内 访问日志中 ip达到100条记录(即pv)  即封掉ip

     重点语句分析
    web日志的格式

    192.168.51.254 - - [22/Nov/2017:09:31:09 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
    192.168.51.254 - - [22/Nov/2017:09:31:09 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
    192.168.51.254 - - [22/Nov/2017:09:31:09 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"

    先来处理时间,让输出时间与日志中时间格式一致
    #date "+%d/%b/%Y:%H:%M"
    22/Nov/2017:09:31

     当前时间的前一分钟和前两分钟表达方式

    time1=`date "+%d/%b/%Y:%H:%M" -d "-1 minute"`
    time2=`date "+%d/%b/%Y:%H:%M" -d "-2 minute"`

    #!/bin/bash
    
    log=/tmp/dosip.log
    access_log="/usr/local/nginx/logs/access.log"
    
    [ -f $log ] || touch $log
    
    time=`date "+%d/%b/%Y:%H:%M"`
    time1=`date "+%d/%b/%Y:%H:%M" -d "-1 minute"`
    time2=`date "+%d/%b/%Y:%H:%M" -d "-2 minute"`
    
    add_iptables(){
    while read line
    do
     ip=`echo $line|awk '{print $2}'`
     count=`echo $line|awk '{print $1}'`
     if [ "$count" -ge 100 ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt 1];then
     iptable -I INPUT -s "$ip" -j DROP
     echo "$ip" is DROP
     fi
    done < $log
    }
    
    main(){
    while true
    do
    cat $access_log|egrep "$time|$time1|$time2"|awk '{print $1}'|sort|uniq -c > $log
    add_iptables
    sleep 10
    done
    }
    
    main

    企业实战题7:

    开发mysql多实例启动脚本:
    已知mysql多实例启动命令为:mysqld_safe--defaults-file=/data/3306/my.cnf &
    停止命令为:mysqladmin -u root -poldboy123 -S /data/3306/mysql.sockshutdown
    请完成mysql多实例启动启动脚本的编写
    要求:用函数,case语句、if语句等实现。

     重点语句分析

    先判断 functions 这个文件是否存在,存在即加载  这个文件为shell 提供了一些基础的功能,会设置umask,path,还有语言环境,然后会设置success,failure,warning,normal几种情况下的字体颜色

    action 函数是functions中一个重要的函数,它的作用是打印某个提示信息并执行给定命令

    action:打印某个信息并执行给定的命令,它会根据命令执行的结果来调用 success,failure方法

    action() {
    local STRING rc

    STRING=$1
    echo -n "$STRING "
    shift
    "$@" && success $"$STRING" || failure $"$STRING"
    rc=$?
    echo
    return $rc
    }

    #!/bin/bash
    [ -f /etc/init.d/functions ] && . /etc/init.d/functions
    MYUSER=root
    MYPASS=oldboy123
    SOCKET=/data/3306/mysql.sock
    MYCNF=/data/3306/my.cnf
    MYCMD="mysql -u$MYUSER -p$MYPASS -S$SOCKET"
    MYADMIN="mysqladmin -u$MYUSER -p$MYPASS -S$SOCKET"
    judge(){ 
    if [ $RETVAL -eq 0 ];then
    action "$1 mysql" /bin/true
    else
    action
    "$1 mysql" /bin/false
    fi
    return $RETVAL
    }

    start(){
    mysqld_safe
    --defaults-file=$MYCNF &>/dev/null &
    RETVAL
    =$? sleep 2
    judge start
    }

    stop()
    {
    mysqladmin
    -u$MYUSER -p$MYPASS -S$SOCKET shutdown >/dev/null 2>&1
    RETVAL
    =$?
    judge stop
    }

    case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    stop
    sleep 3
    start
    ;;
    *)
    echo "$0 {start|stop|restart}"
    exit $retval
    esac

     企业实战题8:

     如何实现对MySQL数据库进行分库备份,请用脚本实现

    重点语句分析
    备份语句 :

    mysqldump -u$MYUSER -p$MYPASS -S$SOCKET -x -B -F -R databaseName
    -x 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,
    并且自动关闭--single-transaction 和--lock-tables 选项。
    -B 备份指定的库
    -F
    开始导出之前刷新日志。
    请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。
    除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。
    因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。
    -R 导出存储过程以及自定义函数

    提取数据库名称到数组:

    dataArray=(`mysql -uroot -pxxx -e"show databases;" |egrep -v "Database|schema"`)

    #!/bin/bash
    
    user=root
    pwd=192.168.51.9
    socket="/var/lib/mysql/mysql.sock"
    mysqldump="mysqldump -u$user -p$pwd -S$socket -x -B -F -R"
    backup=/var/sqlbackup
    
    [ -f $backup ] || mkdir -p $backup
    dataArray=(`mysql -u$user -p$pwd -e"show databases;" |egrep -v "Database|schema"`)
    
    for i in ${dataArray[*]}
    do
    $mysqldump $i | gzip > ${backup}/"$i"_$(date +"%F").sql.gz 
    done

    企业实践题9:

    如何实现对MySQL数据库进行分库加分表备份,请用脚本实现

    重点语句分析
    备份语句 :

    mysqldump -u$MYUSER -p$MYPASS -S$SOCKET -x  -F -R databaseName tableName

    用两个for循环来备份每一张表

    这里将各数据库名称存到数组里

    将各个表名存在字符串中

    #!/bin/bash
    
    user=root
    pwd=192.168.51.9
    socket="/var/lib/mysql/mysql.sock"
    mysqldump="mysqldump -u$user -p$pwd -S$socket -x -F -R"
    backup=/var/sqlbackup2
    
    [ -f $backup ] || mkdir -p $backup
    
    dataArray=(`mysql -u$user -p$pwd -e"show databases;" |egrep -v "Database|schema"`)
    
    for i in ${dataArray[*]}
    do
     Table=`mysql -u$user -p$pwd -e"show tables from $i" | egrep -v "Tables_in_"`
       for t in $Table
       do
       $mysqldump $i $t | gzip > ${backup}/"$i"_"$t"_`date +"%F"`.sql.gz
       done
    
    done

     企业实践题10
    请用至少两种方法实现!

    bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。
    I am oldboy teacher welcome to oldboy training class.

     方法一:数组 + for循环

     重点语句分析
    ${#i} 取字符串长度
    #!/bin/bash
    array=(I am oldboy teacher welcome to oldboy training class)
    for i in ${array[*]}
    do
    if [ ${#i} -le 6 ];then
    echo -n "$i "
    fi
    done
    
    echo

    方法二:for循环 + awk判断字符串长度

     重点语句分析
    awk里引用shell中的变量 用 '"$i"'

    #!/bin/bash
    a="I am oldboy teacher welcome to oldboy training class"
    b=`echo "$a"|wc -w`
    
    for ((i=1;i<=$b;i++))
    do
     if [ `echo $a|awk '{print length($'"$i"')}'` -le 6 ];then
     echo $a| awk '{print $'"$i"'}'
     fi
    done

    企业实践题11:

    开发shell脚本分别实现

    以脚本传参以及read读入的方式比较2个整数大小。以屏幕输出的方式提醒用户比较结果。

    注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数做判断。 

     脚本1 以read读入的方式

    重点语句分析:

    判断字符串为纯数字   "$num1" =~ ^[0-9]+$

    ^[0-9]+$ 表示   正则表达式  以数字开头 以数字结尾 中间有1到无限个数字 的字符串

    或者 

    [ "`echo "$num1"|sed -r ' s/[^0-9]//g'`" = "$num1" ] || {
        echo "first arg must be int."
        exit 2
    }
    #!/bin/bash
    echo -e "please enter two number separated by space 
     like 5 4 "
    read num1 num2
    if [[ "$num1" =~ ^[0-9]+$ && "$num2" =~ ^[0-9]+$ ]];then
      if [ "$num1" -gt "$num2" ];then
       echo "$num1 > $num2"
      elif [ "$num1" -eq "$num2" ];then
       echo "$num1 = $num2"
      else
       echo "$num1 < $num2"
      fi
    else
     echo not number,please input number
    fi

     脚本2   用脚本传参的方式

    重点语句分析:

    #!/bin/bash
    if [[ "$1" =~ ^[0-9]+$ && "$2" =~ ^[0-9]+$ ]];then
      if [ "$1" -gt "$2" ];then
       echo "$1 > $2"
      elif [ "$1" -eq "$2" ];then
       echo "$1 = $2"
      else
       echo "$1 < $2"
      fi
    else
     echo not number,please input number
    fi

    企业实践题12:

    打印选择菜单,一键安装Web服务:

    要求:

    1、当用户输入1时,输出“startinstalling lamp.”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本;

    2、当用户输入2时,输出“startinstalling lnmp.”然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本;

    3、当输入3时,退出当前菜单及脚本;

    4、当输入任何其它字符,给出提示“Input error”后退出脚本。

    5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。

    方法一:使用单个判断

    #!/bin/bash
    mean(){
    echo -e "********************
    "
    echo -e "1.Install LAMP
    "
    echo -e "2.INstall LNMP
    "
    echo -e "3.exit"
    }
    
    mean
    
    read -p "enter your select: " num
    
    [ $num -eq 1 ] && {
    echo "start install LAMP"
    if [ -x /root/lamp.sh ];then
       /bin/bash /root/lamp.sh
    else
      echo "not exit lamp.sh or permission denied"
      exit 1
    fi
    }
    
    [ $num -eq 2 ] && {
    echo "start install LNMP"
    if [ -x /root/lnmp.sh ];then
       /bin/bash /root/lamp.sh
    else
      echo "not exit lamp.sh or permission denied"
      exit 2
    fi
    }
    
    
    [ $num -eq 3 ] && {
      exit 3
    }
    
    echo "input is error"

    方法二:使用case

    #!/bin/bash
    mean(){
    echo -e "********************
    "
    echo -e "1.Install LAMP
    "
    echo -e "2.INstall LNMP
    "
    echo -e "3.exit"
    }
    mean
    
    read -p "enter your select: " num
    
    case $num in
     "1")
      echo "start install LAMP"
    if [ -x /root/lamp.sh ];then
       /bin/bash /root/lamp.sh
    else
      echo "not exit lamp.sh or permission denied"
      exit 1
    fi
    ;;
    
    "2")
      echo "start install LNMP"
    if [ -x /root/lamp.sh ];then
       /bin/bash /root/lnmp.sh
    else
      echo "not exit lnmp.sh or permission denied"
      exit 2
    fi
    ;;
    
    "3")
    exit 3
    ;;
    
    *)
    echo "input is error"
    ;;

    企业实践题13:

    1、监控web服务是否正常,不低于3种监控策略。

    2、监控db服务是否正常,不低于3种监控策略。
         要求间隔1分钟,持续监控。

    重点语句分析:

    主要在于监控的方法,对于web和db 都通用的方法有 ping、netstat、ps 

    web还可以用curl来监控

    db还可以用 mysql -u -p -e"show databases"

    脚本1 四种方法监控web服务

    #!/bin/bash
    ip=10.0.0.45
    index=10.0.0.45
    port=80
    process="nginx: master process"
    
    ping_stat(){
     ping -c 1 $ip >/dev/null 2>&1
     if [ "$?" -ne 0 ];then
     echo "the web server $ip is down "
     fi
    }
    
    
    curl_stat(){
    http_code=`curl -m 5 -s -o /dev/null -w %{http_code} $index`
    if [ $http_code -ne 200 ];then
     echo "the web index is down"
    fi
    }
    
    net_stat(){
    a=`netstat -anlt|grep -w $port|wc -l`
    [ "$a" -lt 1 ] && echo "the web listen is down "
    }
    
    ps_aux(){
    b=`ps aux |grep "$process"|grep -v grep|wc -l`
    [ "$b" -lt 1 ] && echo "the web process is down "
    }
    
    main(){
    while true
    do ping_stat curl_stat net_stat ps_aux sleep 60
    done
    } main

    脚本2 四种方法监控数据库

    #!/bin/bash
    
    ip=10.0.0.45
    port=3306
    process="/usr/sbin/mysqld"
    
    ping_stat(){
     ping -c 1 $ip >/dev/null 2>&1
     if [ "$?" -ne 0 ];then
     echo "the database server $ip is down "
     fi
    }
    
    
    database_stat(){
    count=`mysql -uroot -p192.168.51.9 -e"show databases"|grep -w "ERROR"|wc -l `
    if [ $count -ge 1 ];then
     echo "the database is down"
    fi
    }
    
    net_stat(){
    a=`netstat -anlt|grep -w $port|wc -l`
    [ "$a" -lt 1 ] && echo "the database listen is down "
    }
    
    ps_aux(){
    b=`ps aux |grep "$process"|grep -v grep|wc -l`
    [ "$b" -lt 1 ] && echo "the database process is down "
    }
    "13.2old.sh" 42L, 617C written
    [root@fastdfs2 ~]# vi 13.2old.sh 
    #!/bin/bash
    
    ip=10.0.0.45
    port=3306
    process="/usr/sbin/mysqld"
    
    ping_stat(){
     ping -c 1 $ip >/dev/null 2>&1
     if [ "$?" -ne 0 ];then
     echo "the database server $ip is down "
     fi
    }
    
    
    database_stat(){
    count=`mysql -uroot -p192.168.51.9 -e"show databases"|grep -w "ERROR"|wc -l `
    if [ $count -ge 1 ];then
     echo "the database is down"
    fi
    }
    
    net_stat(){
    a=`netstat -anlt|grep -w $port|wc -l`
    [ "$a" -lt 1 ] && echo "the database listen is down "
    }
    
    ps_aux(){
    b=`ps aux |grep "$process"|grep -v grep|wc -l`
    [ "$b" -lt 1 ] && echo "the database process is down "
    }
    
    main(){
    while true
    do
    ping_stat database_stat net_stat ps_aux sleep 60
    done
    } main

    企业实践题14:

    监控memcache服务是否正常,模拟用户(web客户端)检测。

    使用nc命令加上set/get来模拟检测,以及监控响应时间及命中率。

    重点语句分析:

    使用nc
    设置值  printf "set test 0 0 4 good "|nc 10.0.0.45 12000
    取值      printf "get test "|nc 10.0.0.45 12000

    监控响应时间 
    time echo stats |nc 10.0.0.45 12000 &>/dev/null 

    监控命中率a  
    hit=`echo stats |nc 10.0.0.45 12000|grep get_hits|awk '{print $3}'`
    miss=`echo stats |nc 10.0.0.45 12000|grep get_misses|awk '{print $3}'`
    let a=$hit/($hit+$miss)

    #!/bin/bash
    
    printf "set test 0 0 4
    good
    "|nc 10.0.0.45 12000
    a=`printf "get test
    "|nc 10.0.0.45 12000|awk 'NR==2 {print $0}'`
    
    [ $a == "good"] || echo "memcache is down" && time echo stats |nc 10.0.0.45 12000 &>/dev/null 
    
    hit=`echo stats |nc 10.0.0.45 12000|grep get_hits|awk '{print $3}'`
    miss=`echo stats |nc 10.0.0.45 12000|grep get_misses|awk '{print $3}'`
    let b=$hit/'($hit+$miss)'
    
    echo "the memcache hit is $b"

    企业实践题15:

    监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了)
    如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次(10分钟时间完成)。

    重点语句分析:

    这道题有个简单的办法,直接使用inotify 实时监控目录中的变化,先写一个这个脚本再写一个常规的脚本

    方法一:inotify
    这是一个很简单的脚本,没有对inotify的输出信息做更好的过滤(类似下面输出)

    /var/www/html/123MODIFY
    /var/www/html/.1.html.swpMODIFY
    /var/www/html/.1.html.swpMODIFY
    /var/www/html/.1.html.swpMODIFY
    /var/www/html/1.htmlMOVED_FROM
    /var/www/html/1.html~MOVED_TO
    /var/www/html/1.htmlMODIFY
    /var/www/html/.1.html.swpMODIFY

    #!/bin/bash
    
    webdir=/var/www/html
    
    inotifywait -rm -e move,modify --format '%w%f%e' $webdir|while read info
    do
    echo "$info"|mail -s "warring" yourmail@163.com
    done

    方法二:

    常规方法,网上流传的脚本都是 通过这条命令 find $DIR -print0 | xargs -0 du -ab
    来输出每个文件的 大小,然后将前后两次的输出做比对。
    再把脚本设置crontab 定时就行了

    这个脚本的缺点是,如果修改前后的文件大小一致,则无法出现告警!!!
    先看一下这个脚本

    先运行
    find $webdir -print0 | xargs -0 du -ab > $TMP_A
    脚本:

    #!/bin/bash webdir=/var/www/html TMP_A=/tmp/a.txt TMP_B=/tmp/b.txt TMP_C=/tmp/c.txt find $webdir -print0 | xargs -0 du -ab > $TMP_B diff $TMP_A $TMP_B > $TMP_C if [ -z $TMP_C ];then echo "html is good" else text=`cat $TMP_C|awk '{print $3}'|sort -n|uniq|sed '/^$/d'` echo $text | mail -s "warring" yourmail@163.com fi

    方法三
    对比每个文件的md5 来实现
    首先创建原始MD5文件,old_md5.txt,以这个文件为依据。
    第二步 对比文件数量,看文件数是否增多或者减少
    第三步 对比新旧文件的MD5值,看是否发生修改

    #!/bin/bash
     
    webdir=/var/www/html
    old_md5=/tmp/old_md5.txt     原始MD5文件
    oldfiles=/tmp/old_files.txt  原始文件名列表
    newfiles=/tmp/new_files.txt  新文件名列表
    mailtext=/tmp/mail.txt       邮件内容
     
    初始化 原始MD5函数;没有原始MD5文件没有$1 则提示输入web目录;有$1则创建初始化MD5文件; old_md5(){
    if [ ! -f $old_md5 ];then if [ -z "$1" ];then echo "md5 file is not exit,please add argument that web directory absolute path " echo "$1" exit 1 else find $1 -type f|xargs md5sum > $old_md5 #创建web目录下每个文件的MD5 exit 2 fi fi }
    对比文件数量,检测时候有被删除或者新增加的web 文件 compare_files(){
    cat $old_md5|awk '{print $2}'|sort > $oldfiles find $webdir -type f|sort > $newfiles echo "the lost files:" comm -23 "$oldfiles" "$newfiles" > $mailtext echo "the add files:" comm -13 "$oldfiles" "$newfiles" > $mailtext }
    对比每个文件的MD5,检测文件是否被修改过 compare_md5(){
    echo "file content check: " while read line do filename=`echo $line|awk '{print $2}'` filemd5=`echo $line|awk '{print $1}'` newmd5=`md5sum $filename|awk '{print $1}'` if [ "$filemd5" = "$newmd5" ];then echo "$filename md5 is correct" else echo -e "33[31m$filename md5 is error33[0m" > $mailtext fi done < $old_md5 } main(){ old_md5 $1 compare_files compare_md5 } main $1 [ -f $mailtext ] && mail -s "warring" yourmail@163.com < $mailtext $$ rm -y $mailtext

      

      



  • 相关阅读:
    React antd的select框的onchange事件 只能点击一次 如果想选中的值 还可以被点击 就用onselect事件
    formatTime.js
    typeScript
    React react-router在url参数不同的情况下跳转页面不更新
    React 组件
    三、猜字符小游戏
    二、Java学习之方法
    Java学习之数组
    JavaWeb的学习--第五天 javascript03
    JavaWeb的学习--第四天 javascript02
  • 原文地址:https://www.cnblogs.com/centos2017/p/7871829.html
Copyright © 2020-2023  润新知