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


24

我想将文件/etc/恢复为原始安装形式。自安装文件以来,我已经对其进行了编辑。如何还原此配置文件?公寓是足够聪明,覆盖编辑配置文件,让我怎么告诉它,我希望它这样做?

为了论证,假设我/etc/foo.conf要从package中还原文件foo


2
对于所有建议清除并重新安装的用户foo,如果bar取决于foo并且我不想删除该bar怎么办?
瑞安·汤普森

Answers:


15

瑞安·汤姆森(Ryan Thomson)提供的答案正朝着正确的方向发展。仍然无法完成这项工作(详细原因如下)。

正确(最简单)的方法是使用-owith apt来传递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软件包版本未更改时将不起作用。从手册页

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

--force-confmiss与丢失的配置文件一起使用。如果版本未更改,它也会失败。引用手册页

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

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

折叠:如果修改了conf文件,并且软件包中的版本确实发生了更改,请始终保留旧版本而不提示您,除非 也指定了 --force-confdef,在这种情况下,首选默认操作。

--force-confdef也会失败,因为默认操作是保留较旧的文件(根据显示的消息指示--force-confask。该行带有一行(Y/I/N/O/D/Z) [default=N],表示保留为默认文件。请参见上文)。如果--force-confnew已指定但版本未更改,那也将不起作用。引用手册页

confdef:如果修改了conf文件,并且软件包中的版本确实发生了更改,请始终选择默认操作而不提示。如果没有默认操作,除非 也给出了--force-confnew--force-confold,它将停止询问用户 ,在这种情况下,它将使用该值来决定最终的操作。

只能--force-confask使用,因为即使版本相同,它也会明确询问您问题。引用手册页

confask:如果conffile已被修改,则即使软件包中的版本没有更改(自dpkg 1.15.8起),也始终建议用软件包中的版本替换它。如果有任何的--force-confmiss--force-confnew--force-confold,或--force-confdef 也给出,它将被用来决定最终的行动。

希望对您有所帮助。


您的回答非常全面,谢谢。是否也可以自动以“ y”回答问题,即有效--force-confnew?我试过了apt-get […] -y,但是没有用。(如果不可能的话,也请编辑答案这样说。)
Tim Landscheidt

@TimLandscheidt,您在问是否可以--force-confnew不问就可以使用?我认为这是默认情况,这意味着它将保留您的更改。--force-confask使得apt总是问这样的问题,否则,你会使用其他选项,如果你已经知道答案。
安华

1
哈,我尝试-o Dpkg::Options::=--force-confnew失败(如您的回答所预料),并且尝试时未阅读错误消息-o Dpkg::Options::="--force-confask --force-confnew"。但是,apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $package正确覆盖的更改配置文件$package。谢谢!
蒂姆·兰德谢特

12

如果危害已经消除,则可以使用以下命令行方法来获取配置文件的正式版本。首先,下载软件包文件(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使用Bazaar。如果您喜欢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要还原到的修订版本。


7

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

或者,您可以:

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

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

第二,您也许可以删除文件,而--reinstall可以替换它。如果是这样,那会更安全。


2
不,删除配置文件被认为是有效的修改,并由apt保留。
瑞安·汤普森

如果其他已安装的软件包依赖于该软件包,是否可以清除并重新安装该软件包?
瑞安·汤普森

@RyanThompson是的,apt-get --reinstall purge package不会伤害家属。
奥利(Oli)

不幸的是,它不起作用。
安华

1

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


0

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

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

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

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


哪个软件包会删除您的主目录中的文件?我认为这是一个严重的错误!
吉尔斯(Gillles)“所以-别再邪恶了”,2010年

@吉尔斯:你是对的。清除不会影响您主目录中的个人设置。我编辑并更正了以上内容。sry
piedro

如果其他人依赖它,则清除包装可能不是一个选择。
瑞安·汤普森

0

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

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文件。

显然,这些选项很危险,如果使用不当,有可能破坏重要的系统配置文件。


问题--force-confnew在于,如果版本更改,它将仅安装新的配置文件。如果您要重新安装同一版本,则不会安装新的配置文件,因为我已经对其进行了明确测试
Anwar

并且--force-confmiss只会在版本更改且缺少配置的情况下安装新的配置文件。如手册页中所述confmiss: If a conffile is missing and the version in the package did change, always install the missing conffile without prompting. This is dangerous, since it means not preserving a change (removing) made to the file.
Anwar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.