AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 12699
Accepted
Ryan C. Thompson
Ryan C. Thompson
Asked: 2010-11-12 08:55:36 +0800 CST2010-11-12 08:55:36 +0800 CST 2010-11-12 08:55:36 +0800 CST

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

  • 772

我想将文件/etc/恢复为最初安装的形式。自安装以来,我已经编辑了该文件。我怎样才能恢复这个配置文件?Apt 足够聪明,不会覆盖已编辑的配置文件,那么我如何告诉它我希望它这样做呢?

为了论证起见,假设我想/etc/foo.conf从 package中恢复文件foo。

configuration apt
  • 6 6 个回答
  • 12670 Views

6 个回答

  • Voted
  1. Best Answer
    Anwar
    2016-08-29T01:18:29+08:002016-08-29T01:18:29+08:00

    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] ? 
    

    您必须按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:如果某个配置文件被修改并且包中的版本确实发生了变化,请始终保留旧版本而不提示,除非 还指定了--force-confdef ,在这种情况下,首选默认操作。

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

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

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

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

    希望这会有所帮助。

    • 19
  2. Gilles 'SO- stop being evil'
    2010-11-12T11:43:43+08:002010-11-12T11:43:43+08:00

    如果危害已经造成,这里有一个命令行方式来取回配置文件的正式版本。首先,下载包文件(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是您想要恢复到的修订版。

    • 12
  3. Oli
    2010-11-12T09:02:26+08:002010-11-12T09:02:26+08:00

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

    或者你可以:

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

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

    对于第二个,您也许可以只删除该文件,而 --reinstall 可能会替换它。如果是这样,那就更安全了。

    • 7
  4. misterben
    2010-11-12T10:12:19+08:002010-11-12T10:12:19+08:00

    根据包的不同,您可能会在/usr/share/doc/foo/examples.

    • 1
  5. piedro
    2010-11-12T10:49:31+08:002010-11-12T10:49:31+08:00

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

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

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

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

    • 0
  6. Ryan C. Thompson
    2012-08-28T16:18:12+08:002012-08-28T16:18:12+08:00

    我终于找到了多年前依稀记得的答案:

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

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

    • 0

相关问题

  • 如何在键盘上映射未映射的键?[关闭]

  • 是否可以说出我安装的哪些软件包不在原版安装中?

  • 如何删除 PPA?

  • 使用 apt-get upgrade 时如何强制安装内核更新?

  • 保持多个工作站同步

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve