问题描述
按使用-y运行apt-get(或aptitude)但不提示更换配置文件?
我做了以下事情:
ec2run ami-3c994355 --region us-east-1 -n 1 -t m1.large -z us-east-1d
在机器上:
sudo apt-get update
sudo apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
我仍然得到一个提示,询问我想要使用哪个配置文件。这些是提示之前的行:
Setting up grub-pc (1.99-21ubuntu3.1) ...
然后:
┌───────────────────────────────────────────────────────┤ Configuring grub-pc ├───────────────────────────────────────────────────────┐
│ A new version of configuration file /etc/default/grub is available, but the version installed currently has been locally modified. │
│ │
│ What do you want to do about modified configuration file grub? │
│ │
│ install the package maintainer's version │
最佳解决办法
/etc/default/grub
文件是在软件包安装时生成的,这是必要的,因为它与debconf集成在一起。这意味着它不能被视为dpkg conf文件,因此dpkg的配置文件处理不知道它。
相反,它使用ucf
,一种更复杂的Debian工具来处理配置。遗憾的是,这不了解dpkg选项,因此设置Dpkg::Options::="--force-confdef"
无济于事。但它确实有自己的方式来进行no-prompt升级,通过UCF_FORCE_CONFFNEW
和UCF_FORCE_CONFFOLD
环境变量。
ucf
使用debconf
进行提示,因此将debconf接口设置为noninteractive
也会使消息静音。如果你真的想要non-interactive更新,你无论如何都需要这样做 – 任意包可能会问debconf问题(虽然它们通常不会在升级期间)。
您可以通过将DEBIAN_FRONTEND=noninteractive
添加到您的环境中将debconf接口设置为one-off,或者可以通过运行dpkg-reconfigure debconf
并选择非交互式前端来永久设置它。如果您使用非交互式前端,您将获得包可能会提出的任何问题的默认答案。
对于ucf
,默认答案是“保留现有文件”。
所以,完全命令做一个真正的,100%保证的¹no-prompting更新。
sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
¹:从技术上讲,软件包可以使用另一种提示方法而不是debconf,但这违反了Debian政策。如果您遇到这样的包,请提交错误。
次佳解决办法
离开RAOF的答案,并花了无数个小时在网上搜索,以便能够执行完全hands-off更新&在Ubuntu 12.04上的dist-upgrade,我想到了这个感谢这个帖子(https://bugs.launchpad.net/ubuntu/+source/grub/+bug/239674/comments/1)指出当你想使用包维护者grub menu.lst而不是任何可能的本地menu.lst时grub遵守UCF而不是Dpkg选项。编辑。
我将Dpkg force-confnew选项留给了不是grub的其他软件包。
#!/bin/bash
unset UCF_FORCE_CONFFOLD
export UCF_FORCE_CONFFNEW=YES
ucf --purge /boot/grub/menu.lst
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -o Dpkg::Options::="--force-confnew" --force-yes -fuy dist-upgrade
第三种解决办法
以前的解决方案不适用于16.04。这适用于this answer on stack overflow:
sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" install grub-pc
参考资料