最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

shell编程从0到1案例分析

XAMPP案例 admin 444浏览 0评论

01linux

【案例要求】


有两台Linux服务器A和B,加入A可以免密ssh登录到B,不需要输入密码。A和B都有一个目录叫做/data/web,该目录下面有很多的文件,但是我们不知道具体有几层子目录,假若之前A和B上该目录下的文件都是一模一样的。但是现在不确定是否一致了。基于如上的需求需要我们编写一个脚本实现如下的功能,检测A机器和B机器/data/web目录下文件的差异,此处以A机器上的文件作为标准。假如B机器少了一个a.txt文件,我们我们应该能够检测出来,或者B机器上的b.txt文件有改动过,我们也应该能检测出来(此处针对B机器上多了文件暂时不用考虑)。

 

【案例分析】


  1. 对比两个文件是否存在差异,可以使用diff命令来比对,例如diff a.txt b.txt,如果没有任何输出,则表示两个文件内容没有任何差异。但是在本题中使用diff命令并不合适,因为A机器和B机器是分属在不同服务器上的两台机器,要用diff命令必须要把两台机器上的文件拷贝到一台机器上才行,这样就显的并不那么合适了。
  2. 第二种方法就是使用md5sum命令,例如md5sun a.txt会得到一个字符串,md5sum b.txt也会得到一个字符串,然后对比这两个字符串是否一样,如果一样则说明a.txt和b.txt的文件内容是一样的。
  1. 案例要求以A机器上的文件作为标准,所以脚本中就可以把A机器上的所有文件都列出来,然后遍历所有的文件并计算md5sum的值,同时可以远程获取B机器上的文件和md5sum列表,再把列表从B机器上拷贝到A机器上进行对比。

 

【案例解答】


#!/bin/bash

dir=/data/web
B_server=192.168.200.121
find $dir -type f | xargs md5sum > /tmp/a_md5sum.txt
ssh $B_server "find $dir -type f | xargs md5sum > /tmp/b_md5sum.txt"
scp $B_server:/tmp/b_md5sum.txt /tmp/
for f in `awk '{print $2}' /tmp/a_md5sum.txt`
do
  if grep -qw "$f" /tmp/b_md5sum.txt
  then
    md5_a=`grep -w $f /tmp/a_md5sum.txt | awk '{print $1}'`
    md5_b=`grep -w $f /tmp/b_md5sum.txt | awk '{print $1}'`
    if [ $md5_a != $md5_b ]
    then
      echo "$f has been changed"
    fi
  else
    echo "$f has been deleted."
  fi
done

 

【案例详解】


  1. md5sum支持同时对多个文件进行操作,计算的md5的值在第一列,第二列为文件名。如下所示:
    root@yfclouds:/data/web# md5sum 1.txt 3.txt 
    d2fde576f44a6601b73201234b491904  1.txt
    4fb7e693a03d73ab460a97e3f92fd20b  3.txt
    root@yfclouds:/data/web#
  1. xargs放到管道符后面操作,如果它后面再跟着命令的话,那它会把管道前面输出的结果交给xargs后面的命令进行处理。本案例中find $dir -type f | xargs md5sum,会把find出来的所有文件作为md5sum命令的参数。
  1. 远程登录到一台机器并执行命令,可以使用如下方式:
    root@yfclouds:/data/web# ssh 192.168.200.121 "w"                
     11:56:23 up 398 days, 21:53,  1 user,  load average: 0.00, 0.01, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    192.168.211.21   11:45    7:59   0.08s  0.05s -bash
    root@yfclouds:/data/web#

此时输出内容是显示在当前的屏幕上的,也可以把输出的内容写到远程服务器上,方式如脚本内容所示。

  1. 在A机器上以/tmp/a_md5sum.txt为对比对象,所以对该文件的第二列也就是A机器上的文件名列表作为遍历的对象,一次判断如下两个条件:
  • B上是否有该文件,用grep -qw $f /tmp/b_md5sum.txt实现,grep的-q选项只是需要匹配,不需要输出结果,用在if判断语句里面非常的合适,-w选项让匹配更加的精确,比如grep ‘abc’ 1.txt,会把1.txt中abc、abc123、aaabc等行全部匹配到,但是如果加上-w,则只会匹配到abc项。
  • 如果B上有该文件,则对比A机器上该文件的md5和B机器上该文件的md5是否相同。

 

【案例运行结果】


root@yfclouds:/opt/local/jason/shell# sh 22.sh 
b_md5sum.txt

   100%  648     1.6MB/s   00:00    
/data/web/10.txt has been changed
root@yfclouds:/opt/local/jason/shell#

转载请注明:XAMPP中文组官网 » shell编程从0到1案例分析

您必须 登录 才能发表评论!