Rya*_*son 26 configuration apt
我想将文件/etc/恢复为其最初安装的形式。自安装以来,我已经编辑了该文件。我怎样才能恢复这个配置文件?Apt 足够聪明,不会覆盖编辑过的配置文件,那么我如何告诉它我希望它这样做呢?
为了论证,假设我想/etc/foo.conf从包中恢复文件foo。
Anw*_*war 18
Ryan Thomson 提供的答案正朝着正确的方向发展。它仍然无法完成这项工作(详细原因如下)。
正确(也是最简单)的方法是使用-owithapt传递 dpkg 选项并强制dpkg询问您是要保留修改后的配置文件还是原始配置文件。命令将是这样的 -
sudo apt-get --reinstall -o Dpkg::Options::="--force-confask" install foo
Run Code Online (Sandbox Code Playgroud)
这会问你一个类似的问题
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] ?
Run Code Online (Sandbox Code Playgroud)
您必须按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仅当版本更改时才会保留修改后的版本。对于同一个包,它也会失败。引用手册页
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中的任何一个,它将用于决定最终操作。
希望这会有所帮助。
Gil*_*il' 12
如果危害已经造成,这里有一个命令行方式获取配置文件的正式版本。首先,下载包文件(apt-get --download-only如下所示,或从packages.ubuntu.com上的包页面),然后将其内容解压缩到一个临时位置。然后,您可以将文件复制到/etc. 确保尊重原始权限(大多数文件/etc归根和模式 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
Run Code Online (Sandbox Code Playgroud)
请注意,这不适用于不是来自包的配置文件,例如/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
Run Code Online (Sandbox Code Playgroud)
如果您想回到更远的时间,请使用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
Run Code Online (Sandbox Code Playgroud)
第二个感觉更野蛮。如果它使用多个文件,它也可能会清除其他配置。第一个是更多的点击和努力,但它似乎更安全。
第二,您可以删除该文件,而 --reinstall 可能会替换它。如果是这样,那就更安全了。
| 归档时间: |
|
| 查看次数: |
10945 次 |
| 最近记录: |