如何从命令行仅安装安全更新?


333

sudo apt-get upgrade安装所有更新,而不仅仅是安全更新。我知道我可以使用Update Manager仅选择重要的安全更新,但是是否可以从命令行执行此操作?


2
我不这么认为。dist-upgrade将整个系统升级到新版本。我说的是日常更新,就像您在Update Manager中看到的一样。
迈克尔·克伦肖

1
哦,我明白你现在在说什么。嘿,我经常运行apt-get update,我无意间输入了它。感谢您的单挑!
Michael Crenshaw,2010年

7
您需要“ apt-get dist-upgrade”,而不是“ apt-get升级”。“ dist-upgrade”不适用于新发行版(即“ do-release-upgrade”是一个单独的命令)。使用“ dist-upgrade”意味着它将处理新软件包的依赖关系。这可能很重要。
Kees Cook

3
dist-upgrade是Update Manager GUI执行的常规操作。对于诸如内核之类的linux-image-generic软件包,其中有软件包,取决于当前映像,例如linux-image-3.x.y-zz-generic(每个版本都是一个单独的软件包名称),dist-upgrade(允许安装新软件包以满足依赖性)将执行此升级。 ,而升级会将内核软件包显示为受阻。
慢性病2012年

3
apt-get考虑到在每台服务器上列出的位置有多突出,令人惊讶的是没有好的基础答案
Karthik T

Answers:


308

无人值守升级软件包提供了自动安装安全更新的功能。

您可以使用它,但是您可以手动调用它,而不是配置自动零件:

sudo unattended-upgrade -d --dry-run
sudo unattended-upgrade -d

如果要安静地运行它:

sudo unattended-upgrade

注意:当您调用无人值守升级时,请不要在结尾加上“ s”。

这假定默认情况下已安装该软件包。如果没有,请执行以下操作:

sudo apt-get install unattended-upgrades

另请参阅/usr/share/doc/unattended-upgrades/README.md


要禁用自动执行功能,unattended-upgrade您可能需要修改/etc/cron.daily/apt,但不确定这样做是否“正确”
Jaime Hablutzel 2014年

旁注:对于Ubuntu 12.04.5 LTS服务器,unattended-upgrades默认情况下未安装。
猛禽2015年

13
由于您是从命令行执行此操作的,因此可-v用于信息消息或-d调试消息。否则,该实用程序将非常安静,在这种情况下,您需要检查中的日志/var/log/unattended-upgrades。您还可以--dry-run用来模拟但实际上不升级任何东西。有关更多信息和其他选项,请使用--help以获得帮助消息。
ADTC

unattended-upgrades今天学到了一些东西。谢谢!
the0ther

“用于监视运行情况”,它只是调试非交互式消息,对吗?
水瓶座力量

116

有关如何管理更新的一些提示

这对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
    

1
我现在只注意到这篇文章。非常精确。非常感谢(+1)
Danduk82 '16

“ checkrestart”来自何处?我在Ubuntu Trusty中找不到它。我确实找到了“ needrestart”,看起来很适合您的说明?
本XO

可以在debian-goodies软件包中找到:packages.debian.org/wheezy/debian-goodies。也需要重新开始。您可以通过运行以下命令在Xenial上找到两者:$ apt-cache search checkrestart
ILIV,2016年

我得到“ E:无法打开锁文件/ var / lib / dpkg / lock-打开(13:权限被拒绝)”,即使使用sudo也是如此。这是您所提供的更新或命令之一所特有的吗?
内森·霍恩比

最有可能的原因是dpkg的错误/异常终止导致未清除锁定文件。直到,例如,软件包安装未成功完成(完整磁盘等)之后,您才能正常运行,您可能无法运行其他apt-get和dpkg命令,对吗?
ILIV

46

替换/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手册页中的更多信息。

您可以使用--target-releaseapt-getaptitude(至少)一起使用的选项来临时促进某种发行版本的更新,这将允许您固定某些发行版,以便它们有资格升级。

如果您只想将其用于脚本,而不是将其设置为系统的默认值,则可以将规则放置在其他位置,并改为使用:

apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade

这将易于从非默认位置查找首选项文件。

作为示例提供的首选项文件不适用于第三方存储库,如果您也希望固定这些存储库,则可以使用apt-cache policy它们轻松确定所需的固定密钥。


感谢您抽出宝贵时间为您提供详尽的答案。我我知道它是如何工作的。但是,当我创建/ etc / apt / preferences文件并运行apt-get upgrade时,它想升级所有软件包,而不仅仅是安全更新。升级之前和之后的列表完全相同,除了使用/ etc / apt / preferences之外,它不希望升级Leafpad,后者是我从源代码构建并通过dpkg“手动”安装的。这对我来说很奇怪,但是可能对您来说意味着什么。
Michael Crenshaw,2010年

1
您可以查看apt-cache policy命令的情况。选择一个没有安全修复的软件包并运行apt-cache policy packagename。这将列出各种版本的优先级。您应该看到各行和不同的优先级。如果没有优先级为50的行,则由于某种原因,固定不会影响相关的程序包。
Ressu

1
我过去一直遵循这个答案。今天,我发现由于这个答案,我的服务器上没有安装68个安全更新程序包,也没有显示为潜在的安装候选程序。这不是一个好答案!
2014年

12

在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

为了测试作为干运行,没有做任何事情:sudo unattended-upgrade --dry-run

资料来源:https : //help.ubuntu.com/14.04/serverguide/automatic-updates.html


有没有办法使它成为每月计划?
mike.b93 '17

1
@ mike.b93,我相信设置APT::Periodic::Unattended-Upgrade "30";会每30天执行一次。
vcardillo

5

尽管它很丑陋,但是您可以禁用除安全性存储库之外的所有存储库,然后执行以下操作:

sudo apt-get update && sudo apt-get upgrade

我还没有测试过,但是从理论上讲,它只会在安全性仓库中找到更新并应用它们。


是的,那是可能的。我会调查一下。我不太擅长BASH,但是我可以尝试编写一个脚本来实现。
Michael Crenshaw,2010年

好的,我禁用了除Ubuntu安全存储库以外的所有文件,并运行了sudo apt-get update && sudo apt-get upgrade(取消任何升级之前取消)。然后,我重新启用了所有存储库,运行sudo apt-get updatee并打开了Update Manager。标记为安全更新的软件包并非完全apt-get upgrade找到,但它们非常接近-对我来说足够接近。我仍然希望我确切地知道Update Manager的工作方式以及如何从命令行执行相同的操作,但是这样做是可以的。谢谢!
Michael Crenshaw,2010年

3
  • apt-get update:仅读取存储库中的条目-根据现有列表。需要检查什么是新的。
  • apt-get upgrade:没有内核模块的已安装软件包的所有更新。没有版本更新。
  • apt-get dist-upgrade:包含内核模块的已安装软件包的所有更新。没有版本更新。
  • apt-get带有参数-s:仅测试,不执行任何更改。

0

在Debians上,我使用以下命令仅执行安全更新:

apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )

0

我在apt-get或aptitude中都找不到一个选项,但是有人对SuperUser 有相同的问题。唯一的响应是:

Check and adjust /etc/apt/apt.conf.d/50unattended-upgrade. 
Did you replace 'karmic' with the code name of your Ubuntu?

但是,没有答复是否有效。


2
似乎该Wiki页面中描述的方法取决于将aptitude的--target-release参数设置为<release> -security。像该问题的OP一样,该方法将安装所有升级,而不仅仅是安全升级。阅读apt-get和性向手册页,我不认为--target释放参数甚至为了限制升级只是安全,但我不知道究竟有什么对。
Michael Crenshaw,2010年

0

这是一个可以通过几种不同方式实现此目的的脚本:

#!/usr/bin/env bash
set -e

# List upgradable packages
apt-get update
apt list --upgradable 2>/dev/null
# List security upgrades
test "$(apt-get upgrade -s -y)" && (apt-get upgrade -s -y)
# List upgradable apt packages then upgrade
apt-get update && apt-get upgrade -y  -V | grep '=>' | awk '{print$1}' && test "$(apt-get upgrade -y)"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.