Как я могу установить только обновления безопасности из командной строки?


333

sudo apt-get upgradeустанавливает все обновления, а не только обновления безопасности. Я знаю, что могу использовать диспетчер обновлений, чтобы выбирать только важные обновления безопасности, но есть ли способ сделать это из командной строки?


2
Я так не думаю. dist-upgrade выводит всю систему на новую версию. Я говорю о ежедневных обновлениях, подобных тем, которые вы видите в диспетчере обновлений.
Майкл Креншоу

1
О, теперь я понимаю, что вы говорите. Хех, я так часто запускаю apt-get update, набираю его, не задумываясь. Спасибо за хедз-ап!
Майкл Креншоу

7
Вы хотите «apt-get dist-upgrade», а не «apt-get upgrade». «dist-upgrade» не для новых выпусков (это «do-release-upgrade» отдельной командой). Использование «dist-upgrade» означает, что он будет обрабатывать изменения зависимостей новых пакетов. Это может быть важно.
Кис Кук

3
dist-upgrade - это обычная операция, выполняемая графическим интерфейсом диспетчера обновлений. Для таких пакетов, как ядро, где есть linux-image-genericпакет, в зависимости от текущего образа, например linux-image-3.x.y-zz-generic(каждая версия которого является отдельным именем пакета), dist-upgrade (который позволяет устанавливать новые пакеты для удовлетворения зависимостей) будет выполнять это обновление тогда как обновление покажет пакет ядра как задержанный.
хронит

3
Удивительно, что нет хороших apt-getоснованных ответов для этого, учитывая, как заметно это перечислено на каждом сервере
Karthik T

Ответы:


308

Пакет unattended-upgrades предоставляет функцию автоматической установки обновлений безопасности.

Вы можете использовать это, но вместо настройки автоматической детали вы можете вызвать ее вручную:

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, но вы не уверены, что это «правильно»
Джейм Хаблутцель

примечание: для сервера Ubuntu 12.04.5 LTS unattended-upgradesпо умолчанию не установлено.
Raptor

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, что не является веской причиной для перезапуска службы.

    Поэтому еще один, более надежный способ проверить это с помощью стандартных утилит - это следующий маленький скрипт bash, который я бесстыдно украл с https://locallost.net/?p=233

    Он проверяет, все ли запущенные процессы в системе все еще используют удаленные библиотеки, благодаря хранению их копий в активной памяти.

    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

откуда взялся «checkrestart»? Я не могу найти это в Ubuntu Trusty. Я нашел "needrestart", который выглядит так, как будто бы он подходит к твоим инструкциям?
Бен XO

Его можно найти в пакете debian-goodies: packages.debian.org/wheezy/debian-goodies . Там также нужно перезапустить. Вы можете найти оба в Xenial, запустив: $ apt-cache search checkrestart
ILIV

Я получаю «E: Не удалось открыть файл блокировки / var / lib / dpkg / lock - open (13: Permission denied)» даже с помощью 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-releaseопцией, которая работает с apt-getи aptitude(по крайней мере), которая позволит вам закрепить определенные выпуски, чтобы они имели право на обновление.

Если вы хотите использовать это только для сценариев и не устанавливать по умолчанию для системы, вы можете поместить правила в другое место и использовать вместо этого:

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

Это заставит apt искать файл настроек из нестандартного местоположения.

Файл настроек, приведенный в качестве примера, не применяется к сторонним репозиториям. Если вы хотите закрепить их, вы можете apt-cache policyлегко определить необходимые ключи для закрепления.


Спасибо, что нашли время для подробного ответа. Я думаю, я понимаю, как это работает. Но когда я создаю файл / etc / apt / preferences и запускаю apt-get upgrade, он хочет обновить все пакеты, а не только обновления безопасности. Обновление списка до и после точно такое же, за исключением / etc / apt / предпочтений, которые он не хочет обновлять Leafpad, который я собрал из исходного кода и установил «вручную» с помощью dpkg. Это очень странно для меня, но может что-то значить для вас.
Майкл Креншоу

1
Вы можете увидеть, что происходит с помощью команды apt-cache policy. Выберите один из пакетов, который не получил исправления безопасности, и запустите apt-cache policy packagename. Это перечислит приоритеты для различных версий. Вы должны увидеть различные линии и разные приоритеты. Если нет строк с приоритетом 50, закрепление не влияет на рассматриваемые пакеты по какой-то причине.
Ressu

1
Я следовал за этим ответом в прошлом. Сегодня я узнал, что благодаря этому ответу 68 пакетов обновлений безопасности НЕ были установлены на моем сервере и не показывались в качестве потенциальных кандидатов для установки. Это НЕ ХОРОШИЙ ОТВЕТ!
тень

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

1
@ mike.b93, я считаю, что настройка APT::Periodic::Unattended-Upgrade "30";будет делать это - каждые 30 дней.
vcardillo

5

Хотя это довольно уродливо, вы можете отключить все репозитории, кроме репозитория безопасности, и затем сделать:

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

Я не проверял его, но теоретически он будет только находить обновления в репозитории безопасности и применять их ...


Да, это возможно. Я посмотрю на это. Я не очень хорош в BASH, но я могу попытаться сделать сценарий для этого.
Майкл Креншоу

ОК, я отключил все кроме репозиториев безопасности Ubuntu и запустил sudo apt-get update && sudo apt-get upgrade(отмена до того, как были сделаны какие-либо обновления). Затем я снова включил все свои репозитории, запустил sudo apt-get updateeи открыл диспетчер обновлений. Пакеты, помеченные как обновления безопасности, были не совсем apt-get upgradeнайдены, но они были очень близки - достаточно близко для меня. Мне все еще жаль, что я точно не знал, как Update Manager делает это и как сделать то же самое из командной строки, но это будет делать. Спасибо!
Майкл Креншоу

3
  • apt-get update: просто прочитайте записи в репозитории - в соответствии с существующим списком. Нужно проверить что нового.
  • apt-get upgrade: все обновления для установленных пакетов без модулей ядра. Нет релиза обновления.
  • apt-get dist-upgrade: все обновления для установленных пакетов также с модулями ядра. Нет релиза обновления.
  • apt-getс параметром -s: только тест, без изменений.

0

В Debian я использую эту команду только для обновлений безопасности:

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
Похоже, что метод, описанный на этой вики-странице, зависит от установки аргумента --target-release aptitude в-release -security. Как и ОП этого вопроса, этот метод устанавливает все обновления, а не только обновления безопасности. Чтение APT-получить и страницы человека его способностей, я не думаю , что аргумент --target-релиз даже намерен ограничить модернизацию только безопасность, но я не уверен только , что это является для.
Майкл Креншоу

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)"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.