Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 创建比较多个服务器中多个文件的脚本_Perl_Shell_Ssh_Diff_Sftp - Fatal编程技术网

Perl 创建比较多个服务器中多个文件的脚本

Perl 创建比较多个服务器中多个文件的脚本,perl,shell,ssh,diff,sftp,Perl,Shell,Ssh,Diff,Sftp,我有几个不同的linux服务器,它们本质上都是彼此的镜像。但是,其中一些已不同步(机器1中的文件A与机器2中的文件B不同) 我正在设计一个脚本(shell或Perl),它将系统地遍历某些目录,将不同机器中的相应文件相互区分,并生成一个有意义的报告。稍后,我将尝试同步这些文件 以下是我到目前为止对如何实现这一目标的看法: sftp文件到/tmp和本地差异 使用ssh和diff 使用rsync 我的问题是:系统地比较不同机器(但目录结构相似)中的两个文件的最佳方法是什么?是否有任何内置的Perl实用

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

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

以下是我到目前为止对如何实现这一目标的看法:

  • sftp文件到
    /tmp
    和本地差异
  • 使用
    ssh
    diff
  • 使用
    rsync

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

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

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

    您也可以在这里使用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将内容从othermachine提取到firstmachine。

    您也可以在此处使用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
    

    严格来说,没有必要使用第三台机器进行比较。您还可以将内容从othermachine获取到firstmachine。

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


    不确定在
    Perl
    Python
    中是否有预构建的模块,但其中一个中肯定有一些辅助工具util可用。

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


    不确定在
    Perl
    Python
    中是否有预构建的模块,但其中一个中肯定有一些辅助工具util可用。

    如果您需要了解某些本地和远程文件系统之间的差异,以下方法可将网络负载降至最低:

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

    cp -R $D $C
    
  • 使用rsync复制要在$C上比较的远程目录($R):

    rsync -av --delete $remote_host:$R $C
    
  • 将$D与$C进行比较:

    diff -u $D $C
    

  • 如果需要了解某些本地文件系统和远程文件系统之间的差异,请使用以下方法最小化网络负载:

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

    cp -R $D $C
    
  • 使用rsync复制要在$C上比较的远程目录($R):

    rsync -av --delete $remote_host:$R $C
    
  • 将$D与$C进行比较:

    diff -u $D $C