编辑配置文件后,如何将其恢复为最初安装的版本?

编辑配置文件后,如何将其恢复为最初安装的版本?

我想将文件恢复/etc/到其最初安装的形式。我在安装后编辑了该文件。我该如何恢复此配置文件?Apt 足够智能不是覆盖已编辑的配置文件,那么我该如何告诉它我这样做吗?

为了论证的目的,假设我想/etc/foo.conf从包中恢复文件foo

答案1

答案Ryan Thomson 提供的方法是正确的。但它仍然无法完成这项工作(详细原因如下)。

正确(也是最简单)的方法是使用-owithapt传递 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] ? 

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

笔记:替换后,你会发现修改后的文件为at /etc/foo/foo.conf.dpkg-old


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

因为 dpkg 中的其他选项不太好用。处理软件包配置文件的选项是

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

--force-confmiss当软件包版本不变时,它将无法工作。来自 man-page

如果修改了 conffile,并且包中的版本确实发生了变化,则始终在不提示的情况下安装新版本,除非 --force-confdef也已指定,在这种情况下优先采用默认操作。

--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 也给出了,它将用于决定最终的行动。

希望这会有所帮助。

答案2

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

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 使用市场。如果您更喜欢 Darcs、Git 或 Mercury,请/etc/etckeeper/etckeeper.conf在运行之前更改设置。etckeeper init

使用 Bazaar 恢复/etc/foo.conf到上次提交的版本:

cd /etc
sudo bzr revert foo.conf

如果您想回到更早的时期,请使用sudo bzr log foo.conf查看文件的历史记录,并sudo bzr revert -r 42 foo.conf确定这revno: 42是您想要恢复的修订版本。

答案3

您可以从以下位置手动下载软件包packages.ubuntu.com,提取文件并用它替换你的版本。

或者你可以:

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

第二种方法感觉更粗暴。如果使用多个文件,它可能会清除其他配置。第一种方法需要更多点击和努力,但似乎更安全。

对于第二种情况,您可能只需删除该文件,然后 --reinstall 可能会替换它。如果是这样,那就更安全了。

答案4

使用 Synaptic(Ubuntu tweak 更方便,但 synaptic 更直接),并选择“完全删除包”。这将删除所有配置文件(您可能需要备份这些文件!)。

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

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

ps:Synaptic 也使用了“清除”选项(如上面 Oli 所提到的...) - 只是带有 GUI 以便于更舒适的处理。

相关内容