我管理着大约 7 台 Debian 服务器,我想将它们设置为自动更新。所以,我创建了一个这样的脚本:
#!/bin/sh
apt-get update
apt-get upgrade
并将其放入 的root
crontab 列表中。不幸的是,它总是挂在升级部分,询问我是否确定要升级。因为这是一个 cron 作业,所以我看不到输出,直到它通过电子邮件告诉我它失败了。有没有办法让它跳过该提示,而自动进行升级?
答案1
使用 apt-get 的 -y 选项让它不询问。从man apt-get
:
-y, --yes, --assume-yes
Automatic yes to prompts; assume "yes" as answer to all prompts and
run non-interactively. If an undesirable situation, such as
changing a held package, trying to install a unauthenticated
package or removing an essential package occurs then apt-get will
abort. Configuration Item: APT::Get::Assume-Yes.
您还可以设置 DEBIAN_FRONTEND 环境变量
DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
答案2
好吧,也许您使用了错误的工具。unattended-upgrades
package每天安装安全升级(可配置),可以配置哪些包升级或不升级等。可以使用以下方式安装:
sudo apt-get install unattended-upgrades
从man unattended-upgrades
:
配置是通过 apt 配置机制完成的。默认配置文件可以在 /etc/apt/apt.conf.d/50unattended-upgrades 中找到
答案3
虽然前面的答案提供了丰富的信息,但它们并没有回避 期间人类手段所需的输入问题upgrade
。因此,我正在使用以下内容:
export DEBIAN_FRONTEND=noninteractive
export DEBIAN_PRIORITY=critical
sudo -E apt-get -qy update
sudo -E apt-get -qy -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" upgrade
sudo -E apt-get -qy autoclean
要包含“分发”升级(例如内核),请使用该dist-upgrade
命令。
请参阅的手册页dpkg
有关这些参数的深入信息。
重要的提示: 呼叫sudo
包括-E
需要参数:
Indicates to the security policy that the user wishes to preserve their existing environment variables. The security policy may return an error if the user does not have permission to preserve the environment.
否则,该EXPORT
语句不会影响apt-get
!
信用归于雷米·范·埃尔斯特!谢谢!
答案4
感谢 @diegocn 在 a 中的帖子GitHub问题,我发现这个命令可以禁用交互性:
echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections
debconf-set-selections
可用于在 debconf 数据库中预先添加答案,或更改数据库中的答案。每个问题都会被标记为可见,以防止 debconf 交互式地询问问题。
警告
仅使用此命令为将要安装或已安装的软件包植入 debconf 值。否则,您最终可能会在数据库中得到已卸载软件包的值,这些值不会消失,或者会出现涉及共享值的更严重的问题。建议仅在原始计算机具有相同安装的情况下才将其用于为数据库做种。