问题描述
sudo apt-get upgrade
安装所有更新,而不只是安全更新。我知道我可以使用更新管理器来选择仅重要的安全更新,但有没有办法从命令行执行此操作?
最佳解决思路
包unattended-upgrades提供了自动安装安全更新的功能。
你可以使用它,而不是配置自动部分,你可以手动调用它。对于这种情况,下面应该安静地做:
sudo unattended-upgrades
或更详细的版本,以控制它的发展
sudo unattended-upgrades -d
这假定软件包是默认安装的,它可能是。如果不是,只要做到:
sudo apt-get install unattended-upgrades
另见/usr/share/doc/unattended-upgrades/README.md
。
次佳解决思路
关于如何管理更新的一些提示
这既适用于Debian也适用于Ubuntu,但更多关于Ubuntu的具体说明如下。
-
仅显示安全更新:
apt-get -s dist-upgrade |grep "^Inst" |grep -i securi
要么
sudo unattended-upgrade --dry-run -d
要么
/usr/lib/update-notifier/apt-check -p
-
显示所有可升级的软件包
apt-get -s dist-upgrade | grep "^Inst"
-
仅安装安全更新
apt-get -s dist-upgrade | grep "^Inst" | grep -i securi | awk -F " " {'print $2'} | xargs apt-get install
笔记:
-
有时候Ubuntu会显示安全更新,就好像它们来自$ release-updates存储库。据我所知,这是因为Ubuntu开发人员将安全更新推送到$ release-updates存储库以加快其可用性。
如果是这样,您可以执行以下操作来仅显示安全更新:
sudo sh -c 'grep ^deb /etc/apt/sources.list | grep security > /etc/apt/sources.security.only.list'
和
apt-get -s dist-upgrade -o Dir::Etc::SourceList=/etc/apt/sources.security.only.list -o Dir::Etc::SourceParts=/dev/null | grep "^Inst" | awk -F " " {'print $2'}
-
检查包升级后需要重新启动哪些服务。确定事先要升级的软件包并安排重新启动/重新启动。这里的问题是除非你重新启动一个服务,否则它仍然可能会使用一个旧版本的库(最常见的原因),在你安装修复安全漏洞的新软件包之前,它已被加载到内存中。
checkrestart -v
但是请记住,
checkrestart
可能会列出不一定要重新启动的进程。例如,PostgreSQL服务可能会在其内存中引用已经删除的xlog文件,这不是重新启动服务的有效理由。因此,使用标准的utils来检查这个问题的另一种更可靠的方法是我无耻地从https://locallost.net/?p=233中偷取下面的小bash脚本
它通过保留活动内存中的副本来检查系统上正在运行的进程是否仍在使用已删除的库。
ps xh -o pid | while read PROCID; do grep 'so.* (deleted)$' /proc/$PROCID/maps 2> /dev/null if [ $? -eq 0 ]; then CMDLINE=$(sed -e 's/\x00/ /g' < /proc/$PROCID/cmdline) echo -e "\tPID $PROCID $CMDLINE\n" fi done
第三种解决思路
将/etc/apt/preferences
替换为以下内容:
Package: *
Pin: release a=lucid-security
Pin-Priority: 500
Package: *
Pin: release o=Ubuntu
Pin-Priority: 50
现在一个简单的apt-get upgrade
将仅升级所有安全更新。
为什么(以及如何)这样做:首选项文件会将Ubuntu发行版中的所有软件包固定为优先级50,这会使它们比已安装的软件包更不理想。源自安全储存库的文件被赋予默认(500)优先级,因此它们被考虑用于安装。这意味着只有被认为比当前安装的更受欢迎的软件包才是安全更新。有关在apt_preferences manpage中锁定的更多信息。
您可以使用与apt-get
和aptitude
(至少)一起使用的--target-release
选项临时提升某个发行版以便更新,这样可以固定某些发行版以便它们符合升级条件。
如果您只希望将其用于脚本而不是系统的默认设置,则可以将规则放置在其他某个位置并使用它来代替:
apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade
这将使apt从non-default位置查找首选项文件。
作为示例给出的首选项文件不适用于第三方存储库,如果您希望固定这些存储库,则可以使用apt-cache policy
轻松确定所需的锁定键。
第四种思路
以下在Ubuntu 14.04 LTS中得到确认。
使用unattended-upgrade
软件包。
看看文件/etc/apt/apt.conf.d/50unattended-upgrades
。顶部应该有一个部分:
// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
// "${distro_id}:${distro_codename}-updates";
// "${distro_id}:${distro_codename}-proposed";
// "${distro_id}:${distro_codename}-backports";
};
请注意,默认情况下,它是如何配置为仅允许安全软件包无人参与升级的。
修改文件/etc/apt/apt.conf.d/10periodic
类似于:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
这将每天进行一次自动无人值守安全升级。
现在,手动运行:sudo unattended-upgrade
。
作为dry-run测试,不做任何事情:sudo unattended-upgrade --dry-run
。
来源:https://help.ubuntu.com/14.04/serverguide/automatic-updates.html
第五种思路
虽然它很丑陋,但可以禁用安全存储库以外的所有存储库,然后执行以下操作:
sudo apt-get update && sudo apt-get upgrade
我没有测试过它,但理论上它只会在安全回购中找到更新并应用它们……
第六种思路
-
apt-get update
:只需根据现有列表阅读存储库中的条目。需要检查什么是新的。 -
apt-get upgrade
:没有内核模块的已安装软件包的所有更新。没有发布更新。 -
apt-get dist-upgrade
:所有已安装软件包的更新也与内核模块一起使用。没有发布更新。 -
带参数
-s
的apt-get
:仅测试,不执行更改。