我有两台服务器,除了已知差异外,它们的设置应该相同。
通过运行:
find / \( -path /proc -o -path /sys -o -path /dev \) -prune -o -print | sort > allfiles.txt
我可以找到一台服务器上所有文件的列表,并将其与另一台服务器上的文件列表进行比较。这将向我展示服务器上文件名称的差异。
我真正想要做的是对两个服务器上的所有文件运行校验和,然后比较它们以找出内容不同的地方。例如
find / \( -path /proc -o -path /sys -o -path /dev \) -prune -o -print | xargs /usr/bin/sha1sum
这是明智的做法吗?我认为 rysnc 已经具备了大部分功能,但它可以用来提供差异列表吗?
答案1
您说得对,rsync 非常适合此操作。使用--itemize-changes
(又名 -i)。确保您可以在两端以 root 身份运行此操作(或以其他对机器具有完全访问权限的用户身份运行):
rsync -ani --delete / root@remotehost:/
-a
用于存档,基本上使 rsync 生成一个完全重复的副本(除了涉及链接的某些情况)-n
用于试运行,意味着实际上不会发生任何改变(这一点很重要!:))-i
用于逐项列出更改,并输出一种一旦获得就易于理解的格式,显示每个需要更新的文件(该语法在该触发器的详细帮助下的手册页中进行了完整解释)。--delete
使 rsync 删除目标上存在但不在源上的文件。
如果要排除某些路径,请使用类似 的命令--exclude /var
。排除模式相对于源目录(在本例中为 /,因此它们实际上是绝对的)。
答案2
您可能需要研究 rsync 的 -c 标志。来自man rsync
:
-c, --checksum skip based on checksum, not mod-time & size
我会对 Alex Jurkiewicz 的回答发表评论,但我还没有足够的声誉:'(......
答案3
您应该考虑使用的一个有用工具是rpm -Va
。这将打印出所有包装与打包时不同的文件。这会忽略任何非打包文件,但这是了解自安装以来已更改的文件(属于基本系统的一部分)的一种非常好的方法。它们还包括一个标志,告诉您是否将它们视为配置文件。
例如:
S.5....T c /root/.bashrc
S.5....T c /etc/yum/yum-updatesd.conf
.M...... /usr/bin/rdate
..5....T c /etc/dbbackup.conf
S.5....T c /etc/webalizer.conf
SM5....T c /etc/sysconfig/iptables-config
因此,“配置”文件的大小、时间和 MD5 校验和已经发生了变化。 .bashrc
它的模式已经改变……yum-updatesd.conf
rdate
RPM 数据库是非常有用的东西。