我想将文件/etc/
恢复为原始安装形式。自安装文件以来,我已经对其进行了编辑。如何还原此配置文件?公寓是足够聪明,不覆盖编辑配置文件,让我怎么告诉它,我希望它这样做?
为了论证,假设我/etc/foo.conf
要从package中还原文件foo
。
我想将文件/etc/
恢复为原始安装形式。自安装文件以来,我已经对其进行了编辑。如何还原此配置文件?公寓是足够聪明,不覆盖编辑配置文件,让我怎么告诉它,我希望它这样做?
为了论证,假设我/etc/foo.conf
要从package中还原文件foo
。
Answers:
瑞安·汤姆森(Ryan Thomson)提供的答案正朝着正确的方向发展。仍然无法完成这项工作(详细原因如下)。
正确(最简单)的方法是使用-o
with 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] ?
您必须按Y或I来安装软件包维护者的原始配置文件。您甚至可以按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 也给出,它将被用来决定最终的行动。
希望对您有所帮助。
--force-confnew
?我试过了apt-get […] -y
,但是没有用。(如果不可能的话,也请编辑答案这样说。)
--force-confnew
不问就可以使用?我认为这是默认情况,这意味着它将保留您的更改。--force-confask
使得apt
总是问这样的问题,否则,你会使用其他选项,如果你已经知道答案。
-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
。谢谢!
如果危害已经消除,则可以使用以下命令行方法来获取配置文件的正式版本。首先,下载软件包文件(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 。安装软件包并运行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
要还原到的修订版本。
您可以从packages.ubuntu.com手动下载软件包,解压缩文件并用其替换版本。
或者,您可以:
sudo rm /etc/foo.conf # just for good measure
sudo apt-get --purge --reinstall install foo
第二种感觉更加残酷。如果使用多个文件,它也可能清除其他配置。首先是更多的点击和努力,但似乎更安全。
第二,您也许可以删除文件,而--reinstall可以替换它。如果是这样,那会更安全。
apt-get --reinstall purge package
不会伤害家属。
使用Synaptic(Ubuntu调整更方便,但synaptic更直接)并选择“完全删除软件包”。这将删除所有配置文件(您可能想要备份这些文件!)。
然后重新安装。你完成了。
使用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文件。
显然,这些选项很危险,如果使用不当,有可能破坏重要的系统配置文件。
--force-confnew
在于,如果版本更改,它将仅安装新的配置文件。如果您要重新安装同一版本,则不会安装新的配置文件,因为我已经对其进行了明确测试
--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.
foo
,如果bar
取决于foo
并且我不想删除该bar
怎么办?