Как я могу установить только обновления безопасности из командной строки?
sudo apt-get upgrade
устанавливает все обновления, а не только обновления безопасности. Я знаю, что могу использовать диспетчер обновлений для выбора только важных обновлений безопасности, но есть ли способ сделать это из командной строки?
8 ответов
Пакет 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
,
Несколько советов о том, как управлять обновлениями
Это относится как к 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
Замещать /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
легко определить необходимые ключи для закрепления.
В 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
Если вы хотите установить только обновления безопасности, подойдет следующее. Сначала он перечисляет все обновляемые пакеты, отфильтровывает только те, которые поступают из репозитория безопасности, вырезает возвращаемые строки в первом поле, а затем передает их в apt-get install для обновления пакета.
sudo apt list --upgradable | grep security |cut -d\/ -f1|xargs sudo apt-get install -y
В Debian я использую эту команду только для обновлений безопасности:
apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )
Хотя это довольно уродливо, вы можете отключить все репозитории, кроме репозитория безопасности, и затем сделать:
sudo apt-get update && sudo apt-get upgrade
Я не проверял его, но теоретически он будет только находить обновления в репозитории безопасности и применять их...
apt-get update
: просто прочитайте записи в репозитории - в соответствии с существующим списком. Нужно проверить что нового.apt-get upgrade
: все обновления для установленных пакетов без модулей ядра. Нет релиза обновления.apt-get dist-upgrade
: все обновления для установленных пакетов также с модулями ядра. Нет релиза обновления.apt-get
с параметром-s
: только тест, без изменений.
Вот скрипт, который достигает этого несколькими различными способами:
#!/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)"
Я не могу найти опцию ни в 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?
Никакого ответа относительно того, сработало ли это как бы то ни было.