生成当前 /etc/ 与默认配置之间的差异

生成当前 /etc/ 与默认配置之间的差异

在安装和各种自定义配置之后,是否可以使用例如 apt 和一些 shell-fu 来为 /etc/ 中与标准配置不同的每个文件生成一个 diff?这将提供一种在事后生成配置状态简短摘要的方法,而不必依赖于一路上的手动记录,如果有人希望记住后来发生了什么变化。

答案1

你应该看看etckeeper

etckeeper是一组工具,用于将 /etc 存储在 git、mercurial、darcs 或 bzr 存储库中。它与 apt(以及其他软件包管理器,包括 yum 和 pacman-g2)挂钩,以在软件包升级期间自动提交对 /etc 所做的更改。它跟踪修订控制系统通常不支持但对 /etc 很重要的文件元数据,例如 /etc/shadow 的权限。它非常模块化且可配置,如果您了解使用修订控制的基础知识,它也很容易使用。

答案2

我正在开发针对同一类问题的解决方案。

基本上,我的目标是一个允许以文件级粒度撤消和重做的系统。

从你的问题开始并逆向思考......

  • 为了与默认配置进行比较,我们必须先将所有这些文件的原件存储在某个地方。然后我们可以使用类似...的内容来生成您想要的内容
DIFFDIR= ......
ARCDIR=./.archives                         # see below

function getlastarchive() {
  ... code to return last archived version ...
}

for FILE in /etc/*
do
  ARCFILE="$(getlastarchive $FILE)"
  diff $ARCDIR/$ARCFILE /etc/$FILE  >$DIFFDIR/$FILE.diff
done
  • 为了存储原始文件,我选择采用.archives在包含修改文件的任何目录中都只有一个子目录的惯例。它是根据需要由file-archive脚本创建的。
  • 如果只想要一级撤消,则只需将未改变的文件复制到.archives改变之前的目录中。
  • 对于无限制撤消,我们需要一个版本控制方案。一个明显的选择是将日期时间戳附加到存档版本的名称中。类似于...
Files:                      /etc/hosts
                            /etc/resolv.conf

Archived Versions:          /etc/.archives/hosts.20121219015459
                            /etc/.archives/resolv.conf.20121219015459
  • 相反,我只使用自动计算的增量版本号,如......
Files:                      /etc/hosts
                            /etc/resolv.conf

Archived Versions:          /etc/.archives/hosts.00
                            /etc/.archives/resolv.00.conf
  • 版本号为扩展名,因为我还将其用于图像的编辑版本,这些图像需要其扩展名(.jpg、.png 等)完整无缺,以便被许多软件正确检测到。如果文件没有扩展名,则版本号会附加到末尾。执行此操作的代码更复杂,但可以立即运行,因此没有问题。可以为许多其他方案提供案例,但这对我来说有效。

希望这可以帮助!

相关内容