兄弟連 企業shell筆試題 1-15


這些題目收集自網絡,對比原來的答案,又根據實際情況重新編寫了自己的答案

 

企業實踐題1:

(生產實戰案例):監控MySQL主從同步是否異常,如果異常,則發送短信或者郵件給管理員。提示:如果沒主從同步環境,可以用下面文本放到文件里讀取來模擬:
階段1:開發一個守護進程腳本每30秒實現檢測一次。
階段2:如果同步出現如下錯誤號(1158,1159,1008,1007,1062),則跳過錯誤。

階段3:請使用數組技術實現上述腳本(獲取主從判斷及錯誤號部分)

重點語句分析
mysql查看狀態語句  

mysql>show slave status\G
*************************** 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 status\G"|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 \n 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 "********************\n"
echo -e "1.Install LAMP\n"
echo -e "2.INstall LNMP\n"
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 "********************\n"
echo -e "1.Install LAMP\n"
echo -e "2.INstall LNMP\n"
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\r\ngood\r\n"|nc 10.0.0.45 12000
取值      printf "get test\n"|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\r\ngood\r\n"|nc 10.0.0.45 12000 a=`printf "get test\n"|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 "\033[31m$filename md5 is error\033[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

  

  

 

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM