CentOS 5.x
Mq 问题似乎类似于这个但我不确定……
我有两台服务器(彼此完全隔离),每台服务器都有一个目录和子目录,它们应该具有完全相同的内容。
例如目录布局可能是这样的:
服务器 A-
/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt
服务器 B-
/opt/foo/foob/1092380298309128301283/123.txt
/opt/foo/foob/5094380298309128301283/456.txt
/opt/foo/foob/5092380298309128301283/789.txt
/opt/foo/foob/1592380298309128301283/abc.txt
理想情况下,我希望有一种方法来进行递归检查,并确认所有内容都匹配。
我还想避免使用任何第三方工具。
有任何想法吗?
答案1
一个好方法是使用 md5sums 对树中的每个文件进行检查:
在 server1 上运行此命令:
find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server1.tx
在 server2 上运行
find /opt/foo/foob/ -type f -print0 | xargs -0 md5sum > report_from_server2.tx
然后只需比较这两个文件(使用 diff)或任何你喜欢的。
这是否符合您所寻找的内容?
当然,如果您愿意,您可以使用 SSH 远程执行命令。
答案2
如果你不一定关心什么改变了,只是有些东西已经改变,rsync 在这方面仍然很好用。尝试运行此命令并查看输出,假设这是从“servera”运行的。
rsync -avcn /opt/foo/ serverb:/opt/foo
生成的列表将是那些如果您实际运行同步过程就会被修改的文件。请记住,即使只有时间戳发生变化,但内容保持不变,文件也会显示在列表中。由于我们添加了该-n
标志,因此实际上不会执行任何操作,只会报告。
答案3
虽然您可以编写一个快速脚本来计算目录中各个文件的 MD5 哈希值,但更好的方法是使用一个名为的工具,md5deep
它将递归计算目录中所有文件的哈希值,然后将其输出到一个文件中。然后可以将其用于另一个目录,将第一个哈希文件作为输入,并为您提供两个目录之间不同的文件列表。
因此,以你的例子来说,你可以遵循以下步骤:
计算服务器 A 上所需目录的哈希值:
md5deep -r /opt/foo/ > file_hashes.txt
将文件
file_hashes.txt
file复制到服务器B上进行比较。计算服务器 B 上所需目录的哈希值,但使用标志将服务器 A 中的文件哈希值作为输入文件,
-x
仅显示不同的文件:md5deep -x file_hashes.txt -r /opt/foo/
md5deep 工具集是大多数发行版软件包管理系统的一部分,其优点在于它支持多种不同的哈希算法,而不仅仅是 MD5。因此,如果您担心冲突,则可以使用多种替代方案。以下工具是 md5deep 的一部分,每个工具都提供了一种替代哈希算法:
md5deep - Compute and compare MD5 message digests
sha1deep - Compute and compare SHA-1 message digests
sha256deep - Compute and compare SHA-256 message digests
tigerdeep - Compute and compare Tiger message digests
whirlpooldeep - Compute and compare Whirlpool message digests
答案4
我使用了类似于 @scott-pack 的技术,这将告诉你双向差异。以“删除”开头的所有内容都是远程服务器上的文件,但不在本地服务器上。列出的每个没有任何文件内容的目录都是没有变化的目录。列出的每个文件要么是远程服务器上不存在的文件,要么是本地版本“较新”。
rsync -rvnac --delete /local/directory/ user@remote:/remote/directory/