Як я можу встановити лише оновлення безпеки з командного рядка?


333

sudo apt-get upgradeвстановлює всі оновлення, а не лише оновлення безпеки. Я знаю, що я можу використовувати Менеджер оновлень для вибору лише важливих оновлень безпеки, але чи є спосіб це зробити з командного рядка?


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

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

7
Ви хочете "apt-get dist-upgrade", а не "apt-get upgrade". "dist-upgrade" не для нових версій (це "do-release-upgrade" окрема команда). Використання "dist-upgrade" означає, що він буде працювати з мінливими залежностями нових пакетів. Це може бути важливим.
Кіс Кук

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

3
Дивно, що для цього немає хороших apt-getвідповідей, враховуючи, наскільки чітко це вказано на кожному сервері
Karthik T

Відповіді:


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

бічна примітка: для сервера Ubuntu 12.04.5 LTS unattended-upgradesне встановлено за замовчуванням.
Раптор

13
Оскільки ви робите це з командного рядка, використовуйте -vдля інформаційних повідомлень або -dдля повідомлень про налагодження. Інакше утиліта буде дуже мовчазною, і в цьому випадку вам потрібно буде перевірити журнали /var/log/unattended-upgrades. Ви також можете використовувати --dry-runдля імітації, але насправді нічого не оновити. Для отримання додаткової інформації та інших опцій використовуйте --helpдля отримання довідки.
ADTC

Я сьогодні дізнався кілька речей unattended-upgrades. Дякую!
другого

"для моніторингу того, як це відбувається", це просто налагодження неінтерактивних повідомлень правильно?
Сила Водолія

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

    Тому ще один, більш надійний спосіб перевірити це за допомогою стандартних утиліт - це наступний маленький скрипт, який я безсоромно викрав із 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", який виглядає так, як він би помістився у ваших інструкціях?
Бен ХО

Він може бути знайдений в пакеті Debian-позитивних героїв: packages.debian.org/wheezy/debian-goodies . Також є необхідний старт. Ви можете знайти обох на Xenial, запустивши: $ apt-cache search checkrestart
ILIV

Я отримую "E: Не вдалося відкрити файл блокування / var / lib / dpkg / lock - відкрити (13: дозвіл відхилено)" навіть із sudo. Це щось специфічне для одного з оновлень або поданих команд?
Натан Хорнбі

Швидше за все, мова йде про неправильне / ненормальне припинення dpkg, що залишило файл блокування не очищеним. Не відбувається нормально, поки, наприклад, установка пакета не закінчиться успішно (повний диск тощо). Мабуть, ви не можете запускати інші команди apt-get і dpkg, чи не так?
ІЛІВ

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-cache policyзафіксувати, ви можете легко встановити необхідні ключі для закріплення.


Дякуємо, що знайшли час для детальної відповіді. Я думаю, я розумію, як це працює. Але коли я створю файл / etc / apt / preferences та запускаю apt-get upgrade, він хоче оновити всі пакети, а не лише оновлення безпеки. Оновлення списку до і після абсолютно однакові, за винятком параметрів / etc / apt / налаштування, які він не хоче оновлювати Leafpad, який я створив з джерела та встановив "від руки" dpkg. Мені це дуже дивно, але може щось для тебе означати.
Майкл Креншо

1
Ви можете бачити, що відбувається за допомогою команди apt-кеш-політики. Виберіть один із пакетів, який не отримує виправлення безпеки, і запустіть apt-cache policy packagename. Тут буде вказано пріоритети для різних версій. Ви повинні побачити різні рядки та різні пріоритети. Якщо немає рядків з пріоритетом 50, закріплення з певних причин не впливає на ці пакунки.
Рессу

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знайденими, але вони були дуже близькими - для мене досить близькими. Я все ще хотів би, щоб я точно знав, як це працює диспетчер оновлень і як це зробити з командного рядка, але це зробить. Дякую!
Майкл Креншо

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

Я не можу знайти варіант ні в підході, ні в здатності, проте у когось було те саме питання щодо SuperUser. Єдина відповідь:

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

Немає відповіді на те, чи працювало це.


2
Здається, що метод, описаний на цій сторінці вікі, залежить від встановлення аргументу --taget-release-аргументу на <release> -безпеки. Як і ОР цього питання, цей метод встановлює всі оновлення, а не лише оновлення безпеки. Читаючи сторінки чоловіка apt-get і fitness, я не думаю, що аргумент --target-release навіть призначений для обмеження оновлень лише безпекою, хоча я не впевнений, для чого це потрібно .
Майкл Креншо

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.