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

Mic*_*haw 377 updates package-management security command-line

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

blu*_*yed 347

unattended-upgrades提供了自动安装安全更新的功能。

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

sudo unattended-upgrade -d --dry-run
sudo unattended-upgrade -d # Idem --debug
Run Code Online (Sandbox Code Playgroud)

如果你想安静地运行它:

sudo unattended-upgrade
Run Code Online (Sandbox Code Playgroud)

注意:当您调用 unattended-upgrade 时,您将“s”放在最后(在较新的版本中,有一个符号链接可以避免这种情况)。

这假设该包是默认安装的,它可能是。如果没有,只需执行以下操作:

sudo apt install unattended-upgrades
Run Code Online (Sandbox Code Playgroud)

另见/usr/share/doc/unattended-upgrades/README.md

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

小智 135

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

这适用于 Debian 和 Ubuntu,但更具体的 Ubuntu 说明如下。

笔记:

  • 有时 Ubuntu 会显示安全更新,就好像它们来自 $release-updates 存储库一样。我被告知是这样,因为 Ubuntu 开发人员还将安全更新推送到 $release-updates 存储库,以加快其可用性。

    如果是这种情况,您可以执行以下操作以仅显示安全更新:

    sudo sh -c 'grep ^deb /etc/apt/sources.list | 
        grep security > /etc/apt/sources.security.only.list'
    
    Run Code Online (Sandbox Code Playgroud)

    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'}
    
    Run Code Online (Sandbox Code Playgroud)
  • 检查软件包升级后需要重启哪些服务。事先弄清楚您要升级的软件包并安排重新启动/重新启动。这里的问题是,除非您重新启动服务,否则它仍然可能使用旧版本的库(最常见的原因),该库在您安装修复安全漏洞或其他问题的新包之前已加载到内存中。

    checkrestart -v
    
    Run Code Online (Sandbox Code Playgroud)

    但是,请记住,checkrestart可能会列出不一定要重新启动的进程。例如,PostgreSQL 服务可能会在其内存中保留对已删除的 xlog 文件的引用,这不是重新启动服务的正当理由。

    因此,另一种更可靠的使用标准工具进行检查的方法是以下我无耻地从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
    
    Run Code Online (Sandbox Code Playgroud)

  • 我现在才注意到这个帖子。它非常精确。非常感谢 (+1) (2认同)
  • 对我来说,如果我在 apt-get install 上不包含 -y ,它会在第一个是/否问题时退出仅供参考 (2认同)

Res*_*ssu 46

替换/etc/apt/preferences为以下内容:

Package: *
Pin: release a=lucid-security
Pin-Priority: 500

Package: *
Pin: release o=Ubuntu
Pin-Priority: 50
Run Code Online (Sandbox Code Playgroud)

现在一个简单的apt-get upgrade将只升级所有安全更新。

为什么(以及如何)这是有效的:首选项文件会将 Ubuntu 发行版中的所有软件包固定到优先级 50,这将使它们不如已安装的软件包理想。源自安全存储库的文件具有默认 (500) 优先级,因此可以考虑安装它们。这意味着只有被认为比当前安装的软件包更受欢迎的软件包才是安全更新。apt_preferences 联机帮助页中有关固定的更多信息。

您可以使用--target-release适用于apt-getaptitude(至少)的选项临时推广某个更新发行版,这将允许您固定某些版本,以便它们有资格进行升级。

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

apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我过去一直遵循这个答案。今天我发现,由于这个答案,68 个安全更新包没有安装在我的服务器上,并且没有显示为潜在的安装候选者。这不是一个好答案! (2认同)

vca*_*llo 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";
};
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,它是如何配置为仅允许对安全包进行无人值守升级的。

修改文件/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";
Run Code Online (Sandbox Code Playgroud)

这将每天运行一次自动无人值守安全升级。

现在,手动运行:sudo unattended-upgrade

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

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


小智 12

如果您只想安装安全更新,则可以使用以下方法。首先,它列出所有可升级的软件包,仅过滤掉来自安全存储库的软件包,在第一个字段中剪切返回的字符串,然后将它们传递给 apt-get install 进行软件包更新。

sudo apt list --upgradable | grep security |cut -d\/ -f1|xargs sudo apt-get install -y
Run Code Online (Sandbox Code Playgroud)

  • @keypress 对这个优雅的解决方案进行了很大的改进:使用 `--only-upgrade` 确保不会安装新的软件包。我刚刚用 apt 测试了它并且它有效。 (2认同)

key*_*ess 8

在 Debian 上,我使用此命令仅进行安全更新:

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


Ste*_* RC 5

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

sudo apt-get update && sudo apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

我还没有测试过它,但理论上它只会在安全存储库中找到更新并应用它们......