2014-09-24shell脚本练习题

回复 收藏
借用张先同学的一道题,我觉得非常好,所以发出来给大家一起做一下。题目如下:
有两台Linux服务器A和B,假如A可以直接ssh到B,不用输入密码。A和B都有一个目录叫做/data/web/ 这下面有很多文件,当然我们不知道具体有几层子目录,假若之前A和B上该目录下的文件都是一模一样的。但现在不确定是否一致了。固需要我们写一个脚本实现这样的功能,检测A机器和B机器/data/web/目录下文件的异同,我们以A机器上的文件作为标准。比如,假若B机器少了一个a.txt文件,那我们应该能够检测出来,或者B机器上的b.txt文件有过改动,我们也应该能够检测出来(B机器上多了文件我们不用考虑)。

提示: 使用核心命令  md5sum a.txt  算出md5值,去和B机器上的比较。
2014-09-23 21:07 举报
已邀请:
0

陈沛

赞同来自:

#!/bin/bash
# 2014-09-23
# chenpei
# Server files between detection
# 以A机器上的文件作为标准,检测B机器(前提SSH无密码登陆)

#被检测机器IP地址
IP_B="192.168.182.100"
#日志存储文件
log="/data/file.log"
#检测时间
echo "文件检测时间: `date`" >> $log

#标准A机器上的文件  (文件要从根目录开始,不然报错)
for file_A in `find /data/web -type f`
do
    #文件在B机器上是否存在
    file_B=`ssh $IP_B "find $file_A" 2> /dev/null`
    if [ -z "$file_B" ] ; then
         echo "检测机器上文件${file_A}不存在。" >> $log
         continue;
    fi

    #文件在B机器上是否发生改变
    md5_A=`md5sum $file_A | awk '{print $1}'`
    md5_B=`ssh $IP_B md5sum $file_A | awk '{print $1}'`
    if [[ "$md5_A" != "$md5_B" ]] ; then
          echo "检测机器上文件${file_A}与标准机器上的不一样。" >> $log
    fi
done
#换行
echo " " >> $log
0

齐天大圣

赞同来自:


  1. [root@study ~]# cat md5.sh
  2. #!/bin/bash
  3. #2014-09-24

  4. dir=/data/web
  5. m=/tmp/md5.txt
  6. ip=192.168.0.79
  7. find $dir -type f |xargs md5sum >/tmp/md5.txt
  8. ssh $ip "find $dir -type f |xargs md5sum >/tmp/md5_1.txt"
  9. scp $ip:/tmp/md5_1.txt /tmp

  10. for f1 in `awk '{print $2}' $m`
  11. do
  12.   md5=`grep $f1 $m|awk '{print $1}'`
  13.   md5_1=`grep $f1 /tmp/md5_1.txt|awk '{print $1}'`
  14.   if [ -z $md5_1 ];then
  15.      echo "$f1 not in $ip" |mail -s "error" lichao@jiangmin.com
  16.   elif [ $md5 != $md5_1 ];then
  17.      echo "$f1 have changed in $ip" |mail -s "error2" lichao@jiangmin.com
  18.   fi
  19. done
0

齐天大圣

赞同来自:

陈沛 发表于 2014-9-23 22:55
#!/bin/bash
# 2014-09-23
# chenpei

不错!我想的有点复杂了
0

ocean

赞同来自:

本帖最后由 ocean 于 2014-9-25 10:54 编辑
  1. # cat 0924.sh
  2. #!/bin/bash
  3. # Desc: as the title
  4. # Writen by Jeffery.Su
  5. # Date: Sep,24 2014


  6. REMOTE_IP=172.16.7.81
  7. LOG=/tmp/`date +%y%m%d%H%M`_md5_err.log
  8. MD5_FILE=/tmp/md5.sum
  9. MD5_FILE_OLD=/tmp/md5.sum_`date +%H%M`



  10. ssh $REMOTE_IP find /data -type f |xargs  md5sum  > $MD5_FILE


  11. echo -e "$(date) begin check md5sum\n" >> $LOG
  12. md5sum  --check $MD5_FILE| grep "FAILED" >> $LOG
  13. echo -e "\n$(date) check file size finished" >> $LOG

  14. mv $MD5_FILE $MD5_FILE_OLD

  15. ERR_COUNT=`grep -c FAILED  $LOG`
  16. if [[ $ERR_COUNT -eq 0 ]];then
  17.    echo    "Congratulations! the file completeness is good!"
  18. else
  19.    echo -e "The file has changed!!! please check $LOG"
  20. fi

{:5_121:} 写的有点乱
0

Stary-liu

赞同来自:

#!/bin/bash
# 2014-09-25
IP_hostB="192.168.100.13"
file_hostA=`find /data/web`
    file_hostB=`ssh $IP_B "find $file_hostA" &> /dev/null`
    if [ -z "$file_hostB" ]; then
         echo "$file_hostB is not exit"
         exit 7
    fi
    md5_hostA=`md5sum $file_hostA`
    md5_hostB=`ssh $IP_hostB md5sum $file_A`
    if [ "$md5_hostA" = "$md5_B" ]; then
          echo "equal"
    else "not equal"        
    fi
0

Louis

赞同来自:

  1. #!/bin/bash
  2. ## This script is for differ files in machine A and machine B.use files'md5.
  3. ## Written by Louis at 2014/09/25 19:20

  4. dir=/data/web
  5. ip=192.168.0.102

  6. ssh 192.168.0.102 "find $dir -type f|xargs md5sum" > /tmp/md5_B
  7. scp 192.168.0.102:/tmp/md5_B /tmp/

  8. for file in `find $dir -type f`; do
  9.     if grep -q $file /tmp/md5_B; then
  10.         md5sum_B=`awk '$2=="'$file'" {print $1}' /tmp/md5_B`
  11.         echo $md5sum_B
  12.         md5sum_A=`md5sum $file|awk '{print $1}'`
  13.         if [ "$md5sum_B" != "$md5sum_A" ]; then
  14.             echo $file >> /tmp/change
  15.         fi
  16.     else
  17.         echo $file >> /tmp/lack
  18.     fi
  19. done
  20. if [ ! -z /tmp/change ]; then
  21.     echo "Machine B has changed these files:" `cat /tmp/change|xargs`
  22.     rm -rf /tmp/change
  23. fi
  24. if [ ! -z /tmp/lack ]; then
  25.     echo "Machine B less these files:" `cat /tmp/lack|xargs`
  26.     rm -rf /tmp/lack
  27. fi
思路:
机器B的ip:192.168.0.102
将B机器/data/web的所有文件的md5值计算出并存放于一个文本md5_B,将md5_B传送回A机器,逐一比较A机器中/data/web中的文件,如果文件不存在于md5_B文件中,则表示此文件在B机器缺少;否则计算A机器中文件的md5值,与md5_B文件中对应md5值比较。

0

张小双

赞同来自:

  aa= A---`ls /date/web/ `
  bb=B---`ls /data/web/`
while $bb
if [md5sum $bb -le md5sum $aa -o md5sum $bb -ge md5sum $aa ] ;
then echo $bb;
fi


0

Budweiser小王子

赞同来自:

不懂 看答案来了
0

wyatt88

赞同来自:

  1. #!/bin/bash
  2. #name:check_rfile.sh
  3. #author:ww
  4. #check files in local and remote

  5. a_ip=192.168.243.102
  6. b_ip=192.168.243.216
  7. basedir=/data/web
  8. files=`find $basedir -type f`

  9. for file in $files
  10. do
  11. a_file_md5=`md5sum $file`
  12. b_file_md5=`ssh root@$b_ip "md5sum $file"`
  13. echo $a_file_md5 $b_file_md5
  14. if [ "$a_file_md5" == "$b_file_md5" ]
  15. then
  16.     echo $file" a and b is same"
  17. else
  18.     scp $file root@$b_ip:$file
  19.     if [ $? -eq 1 ]
  20.     then
  21.        b_filedir=`dirname $file`
  22.        echo "filedir:"$b_filedir
  23.        ssh root@$b_ip "mkdir -p $b_filedir"
  24.        if [ $? -eq 0 ]
  25.        then
  26.          scp $file root@$b_ip:$file
  27.        fi
  28.     fi
  29. fi
  30. done
0

ifconfig2

赞同来自:

1
0

ldp840611

赞同来自:

看看
0

wangzai

赞同来自:

学习
0

wy1028

赞同来自:

{:4_91:}
0

kevinjin

赞同来自:

#! /bin/bash
find /data/web/ -type f > A.txt
ssh B;find /data/web/ -type f > B.txt
scp B.txt root@A:/data/web/
for fA in `cat A.txt`
do
    nA=`md5sum $fA`
    for fB in `cat md5sum B.txt`
    do
        nB=`md5sum $fB`
        if [ $fA -ne $fB ]
        then
            echo "something is different."
        fi
    done
done
0

liupeng

赞同来自:

感觉有点难啊
0

hhao

赞同来自:

1
0

kw是id

赞同来自:

#!/bin/bash
dir=/data/web
file_a=`bin/find $dir -type f |awk -F '/' '{print $NF}'`
ip_b=192.168.2.91
install_md5sum () {
 c=`which md5sum`
 if [ $c != "/usr/bin/md5sum" ]
 then
     yum install -y coreutils >/dev/null 2>&1
 fi
}
install_md5sum
/usr/bin/md5sum $file_a >>/tmp/md5_a.txt
/usr/bin/rsync -av /tmp/md5_a.txt root@$ip_b:/tmp
ssh $ip_b
install_md5sum
for file_b in $file_a
do
  if [ -e $dir/$file_b ]
  then
        echo "$file_b on $ip_b is not exist"
        exit 1
  else
       d=`/usr/bin/md5sum $file_b |awk '{print $1}'`
       e=`awk '$2=="$file_b" {print $1}'/tmp/md5_a.txt`
       [ $d -eq $e ] || echo "data in $file_b has changed"
  fi
done


0

dongdongchen

赞同来自:

#!/bin/bash

#2017-02-25

ip_b="192.168.112.153"

basedir=/data/rsync_dir/

file_A=/root/testdev/file_A.txt    #统计在web a机器的文件和md5值

[ -e $file_A ]||touch $file_A

>$file_A

file_not=/root/testdev/file_not.txt  #统计web b机器缺少的文件

[ -e $file_not ] || touch $file_not

>$file_not

file_change=/root/testdev/file_change.txt  #统计web b机器修改过的文件

[ -e $file_change ] || touch $file_change

>$file_change

for i in `find $basedir -type f`;do

    m5=`md5sum $i`

    echo "$m5" >> $file_A

done

for i in `awk '{print $2}' $file_A`;do

    echo "web_A: $i"       #绝对路径的文件名

    file_re=`ssh $ip_b "find $i" 2>/dev/null`

    if [ "$i" != "$file_re" ];then

        echo "Web_B not: $i" >> $file_not

    elif [ "$i"  == "$file_re" ];then

        md5_A=`md5sum $i`

        md5_B=`ssh $ip_b "md5sum $file_re" 2>/dev/null`

        if [ "$md5_A" != "$md5_B" ];then

            echo "Web_B chage: $i" >> $file_change

        fi

   fi 

done

0

王斌

赞同来自:

修行尚浅,待回炉再造

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: