【问题标题】:Creating a script that compares multiple files in multiple servers创建一个比较多个服务器中的多个文件的脚本
【发布时间】:2013-07-06 11:24:30
【问题描述】:

我有几个不同的 linux 服务器,它们本质上都是彼此的镜像。但是,其中一些已经不同步(机器 1 中的文件 A 与机器 2 中的文件 B 不同)。

我正在设计一个脚本(仅限shellPerl),它将系统地遍历某些目录并将不同机器中的相应文件相互比较,并生成有意义的报告。稍后,我会尝试同步文件。

到目前为止,这些是我对如何解决此问题的想法:

  1. sftp 文件到/tmp 和本地差异
  2. 使用sshdiff
  3. 使用rsync

我的问题是:系统地比较不同机器(但目录结构相似)中的两个文件的最佳方法是什么,是否有任何内置的 Perl 实用程序可能有用?

【问题讨论】:

    标签: perl shell ssh diff sftp


    【解决方案1】:

    如果您需要了解一些本地和远程文件系统的区别,下面的方法可以最大限度地减少网络负载:

    1. 制作要比较的本地目录 ($D) 的本地副本 ($C)。即:

      cp -R $D $C
      
    2. 使用 rsync 复制您想要通过 $C 比较的远程目录 ($R):

      rsync -av --delete $remote_host:$R $C
      
    3. 比较 $D 和 $C:

      diff -u $D $C
      

    【讨论】:

      【解决方案2】:

      我曾开发过一个类似的工具(位于python)。它所做的是,在晚上的给定时间运行cron 作业,这会将tar bzipped 文件带到一台服务器,提取目录并在其上运行递归diff。然后,diff 输出通过一些python 脚​​本运行,这些脚本将分析diff hunks(+ 行/! 行等)以了解更改量。

      不确定PerlPython 中是否有预构建模块,但其中一个可能肯定有一些帮助工具。

      【讨论】:

        【解决方案3】:

        你也可以在这里使用 git。一种可能的工作流程:只需签入您要比较的所有文件(或使用git add -A 完成目录)。然后在您的本地工作站上创建一个空的 git 存储库,用于获取所有其他存储库,并用于进行比较:

        git init
        git remote add firstmachine ssh://user@firstmachine/path/to/directory
        git remote add othermachine ssh://user@othermachine/path/to/directory
        git fetch --all
        

        现在可以比较两台机器的内容了:

        git diff remotes/firstmachine/master remotes/othermachine/master
        

        或者只是比较特定文件的内容:

        git diff remotes/firstmachine/master remotes/othermachine/master -- file/to/compare
        

        没有必要使用第三台机器进行比较。您还可以 git-fetch 内容从 othermachine 到 firstmachine。

        【讨论】:

          【解决方案4】:

          rsync 将找出差异并通过仅发送差异来同步您的文件。一旦两个文件夹同步,它将非常快。 (但第一次同步需要一些时间)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-07-30
            • 2014-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多