在编辑完成后,如何将配置文件还原回原来安装的版本?

我想将/etc/的文件还原为其最初安装的表单。 我已经编辑了自安装文件以来的文件。 如何还原此配置文件? Apt非常聪明, 不会覆盖已编辑的配置文件,所以如何告诉它我希望它这样做呢?

为了论证,让我们说我想从包foo恢复文件/etc/foo.conf

Ryan Thomson提供的答案正朝着正确的方向前进。 仍然无法完成这项工作(具体原因如下)。

这样做的正确(也是最简单)方法是使用-oapt传递dpkg选项并强制dpkg询问您是否要保留修改后的配置文件或原始配置文件。 命令将是这样的 –

 sudo apt-get --reinstall -o Dpkg::Options::="--force-confask" install foo 

这会问你一个问题

 Configuration file '/etc/foo/foo.conf' ==> Modified (by you or by a script) since installation. Version in package is the same as at last installation. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** foo.conf (Y/I/N/O/D/Z) [default=N] ? 

你必须按YI来安装软件包维护者的原始配置文件。 您甚至可以按D查看更改内容或使用Z选项启动root shell以自行修复。

注意:更换后,您将找到修改后的文件,如at /etc/foo/foo.conf.dpkg-old


为什么其他选项不起作用?

因为dpkg中的其他选项不能很好地工作。 处理包的配置文件的选项是

  • --force-confmiss
  • --force-confnew
  • --force-confold
  • --force-confdef

当程序包版本不更改时, --force-confmiss将不起作用。 从手册页

如果已修改了配置并且包中的版本确实发生了更改,请始终安装新版本而不提示,除非还指定了–force-confdef ,在这种情况下,首选默认操作。

--force-confmiss使用丢失--force-confmiss 。 当版本没有改变时,它也会失败。 引用手册页

confmiss:如果缺少一个conffile并且包中的版本确实发生了变化,请始终安装缺少的conffile而不提示。 这很危险,因为它意味着不保留对文件所做的更改(删除)

--force-confold在版本更改时才会保留修改后的版本。 对于相同的包装,它也会失败。 引用手册页

confold:如果已修改了一个conffile并且包中的版本确实发生了变化,请始终保留旧版本而不提示,除非还指定了–force-confdef ,在这种情况下,首选默认操作。

--force-confdef也会失败,因为默认操作是保留旧文件(从--force-confask显示的消息中指示。它有行(Y/I/N/O/D/Z) [default=N]这意味着保留是默认的。见上文)。 如果指定了--force-confnew但版本没有更改,那也将无效。 引用手册页

confdef:如果已修改了一个conffile并且包中的版本确实发生了变化,请始终选择默认操作而不提示。 如果没有默认操作,它将停止询问用户,除非还给出了–force-confnew–force-confold ,在这种情况下,它将使用它来决定最终操作。

只有--force-confask有效,因为即使版本相同,它也会明确地问你这个问题。 引用手册页

confask:如果一个conffile被修改,总是提供用包中的版本替换它,即使包中的版本没有改变(因为dpkg 1.15.8)。 如果还给出了–force-confmiss– force -confnew– force -confold–force-confdef中的任何一个,它将用于决定最终操作。

希望会有所帮助。

如果损害已经完成,这里是一个命令行方式来取回配置文件的正式版本。 首先,下载软件包文件(使用apt-get --download-only ,如下所示,或者从packages.ubuntu.com上的软件包页面),然后在临时位置提取其内容。 然后,您可以将文件复制到/etc 确保尊重原始权限( /etc中的大多数文件由root和模式644拥有(即字可读和根可写),但每个例外都有一个重要原因)。

 sudo apt-get --download-only --reinstall install foo mkdir /tmp/foo dpkg-deb -x /var/cache/apt/archives/foo_VERSION_ARCH.deb /tmp/foo 

请注意,这不适用于非来自包的配置文件,例如/etc/fstab/etc/passwd 。 如果你失去了这些,你就是靠自己。 (无论如何,大多数都依赖于系统。)


对于将来,我建议使用etckeeper 安装etckeeper 。 安装包并运行sudo etckeeper init 。 这为/etc所有文件设置版本控制。 你不需要做任何其他事来管理etckeeper; 您只需要在进行版本控制操作时与其进行交互,例如引用较旧的文件。 每次运行apt和每晚之前和之后都会自动提交文件(这是可配置的)。

默认情况下,在Ubuntu上,etckeeper使用Bazaar 。 如果您更喜欢Darcs,Git或Mercury, /etc/etckeeper/etckeeper.conf在运行etckeeper init之前更改/etc/etckeeper/etckeeper.conf的设置。

使用Bazaar,将/etc/foo.conf恢复为最后提交的版本:

 cd /etc sudo bzr revert foo.conf 

如果你想进一步追溯,请使用sudo bzr log foo.conf来查看文件的历史记录,如果你确定revno: 42是你想要的修订版,请使用sudo bzr revert -r 42 foo.conf revno: 42恢复。

您可以从packages.ubuntu.com手动下载软件包 ,解压缩文件并用它替换您的版本。

或者你可以:

 sudo rm /etc/foo.conf # just for good measure sudo apt-get --purge --reinstall install foo 

第二个感觉更野蛮。 如果它使用多个文件,它也可能会擦除其他配置。 首先是更多的点击和努力,但它似乎更安全。

对于第二个,您可能只能删除该文件,而–reinstall可能会替换它。 如果是这样,那将更安全。

根据包的不同,您可以在/usr/share/doc/foo/examples找到默认配置文件。

使用Synaptic(Ubuntu调整更方便但突触更直接)并选择“完全删除包”。 这将删除所有配置文件(您可能希望备份这些文件!)。

然后重新安装。 你完成了。

使用Ubuntu Tweak,您可以获得更多清理,重新打印和配置备份选项。 也许你想看看。 它在软件中心。

ps:Synaptic也使用“清除”选项(如上面提到的Oli …) – 只需一个GUI就可以更舒适地处理。

我终于找到了几年前我隐约记得的答案:

 dpkg --force-confnew --force-confmiss -i PACKAGE.deb 

“confnew”参数强制dpkg将修改后的配置文件替换为包提供的配置文件,“confmiss”同样使用已删除的配置文件。

根据此聊天记录 ,您还可以通过apt-get以下列方式使用这些选项:

 apt-get -o DPkg::Options::="--force-confnew --force-confmiss" --reinstall install PACKAGE 

这样可以避免自己需要找到deb文件。

显然,这些选项很危险,如果误用,可能会泄漏重要的系统配置文件。