Перелічіть доступні оновлення, але не встановлюйте їх


209

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

Відповіді:


231

влучний

Для сучасних версій для aptцього є специфічний перемикач:

apt list --upgradable

вдало дістати

Для старої apt-getкоманди -uперемикач показує список пакетів, доступних для оновлення:

# apt-get -u upgrade --assume-no

На apt-getчоловіковій сторінці :

-u
- оновлення шоу-шоу
 Показ оновлених пакетів; Роздрукуйте список усіх пакетів, які потрібно оновити. Елемент конфігурації: APT :: Get :: Show-Upgraded.
--assume-немає  Автоматичне "ні" для всіх підказок. <== Щоб запобігти його запуску

2
Я сподівався, що це можна зробити без кореня
ThorSummoner

19
При введенні «Y» і натисніть Enter, ця команда буде встановлювати оновлення. Я б точно рекомендував додати "-s", інакше ця відповідь вводить в оману
Murmel

5
Це дуже неправильна відповідь, оскільки (без додаткових опцій) команда чекає на введення, і якщо користувач вводить неправильний вхід, встановлюється пакет, який змінює систему, яка не є тим, чого хоче ОП (щойно сталося в моїй системі)
Даніель Алдер

І btw: -uє типовим варіантомapt-get
Даніель Олдер

1
@ThorSummoner '-s зробить те, що хочеш, і працює без кореня
nevelis

67
apt-get --just-print upgrade

Читається не так легко, нижче наведено perl один вкладиш для аналізу результатів apt-get:

apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}'

Це має вивести щось на кшталт:

PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9

Сподіваємось, це допоможе комусь іншому,


1
тільки для сміху: апт-get -s оновлення | awk -F '[] [()] +' '/ ^ Inst / {printf "Прог:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
тинк

8
Це також може бути набагато приємніше виглядати, якщо використовувати columnтаке:apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | column -s " " -t
AntonioK

1
@AntonioK Чудово виглядає!
псевдонім

1
Боюся, цей Perl-код зламає мою машину ...;)
Кріс,

33

Ще один варіант, натхнений ензотибом:

aptitude search '~U' | wc -l

Ця команда використовуватиме здатність для виведення нових пакетів, а потім wc для просто підрахунку рядків.

З боку, я виявив, що рішення ензотибу без єдиних лапок навколо ~ U не працює для мене. (Wheezy, ZSH, здатність 0.6.8.2)

Оновлення:

З новим підходом ви можете зараз:

apt list --upgradable

Дякую за це, команда доречного списку була саме тим, що я хотів.
дворак

Приємно з цим рішенням, що вам не потрібен sudo / root.
Гунні

25

Найпростіший:

apt list --upgradable

не працює на м’яті.
ychaouche

1
Прикро, що це не повертає різні вихідні коди, залежно від того, є доступні оновлення чи ні. Було б приємно використовувати це в сценарії.
Дейл Андерсон

18

Можна бігати

aptitude -F%p --disable-columns search ~U

або недокументований

/usr/lib/update-notifier/apt-check -p; echo

Ще один метод з використанням apt-getмоделювання:

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'

1
Ця командна здатність працювала для мене чудово і не потребувала кореня
JamesCW

apt-get -s dist-upgrade також працює добре і має такий самий вихід, коли ви передаєте його через цей пробудник
ychaouche

спасибі! це вийшло із пекла певної залежності. намагався, dist-upgradeале не втратити деякі пакунки, необхідні для використання aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')зробив трюк!
Jayen

11

Погляньте на упаковку "apticron":

apticron - простий інструмент для надсилання повідомлень про очікувані оновлення пакета

Apticron - це простий скрипт, який щодня надсилає електронні листи про очікувані оновлення пакета, такі як оновлення безпеки, належну обробку пакетів у режимі очікування як dselect, так і придатність.

https://packages.debian.org/buster/apticron


Ваше посилання порушено ...
Алексіс Вілке

10
apt-get update && apt-get -s upgrade

перелічить доступні оновлення без фактичної установки.

Перша команда оновлює індексні файли пакету, перш ніж буде виконано імітаційне (таким чином, -о) оновлення. "-s" зробить модельоване оновлення, показуючи пакети, які будуть встановлені, але насправді нічого не встановлять.

Навпаки, "-u" замість "-s" насправді встановиться після підтвердження.


2
Параметр імітації може бути запущений будь -s, --simulate, --just-print, --dry-run, --recon, --no-act-яким із моїх улюблених, реконструкція та сухий пробіг.
ThorSummoner

9

Мені потрібна повна інформація про версію щодо можливих оновлень, тому я використав модифікацію відповіді Jasonwryan:

apt-get -V -u upgrade

Це простий і IMO з розумом відформатований вихід.


3

Просто відфільтруйте вихід

apt-get update && apt-get -s -V -u upgrade

мати лише бажану інформацію у своєму журналі.

Швидше за все, вам знадобиться гарна частина після лінії

...

Наступні пакети будуть оновлені:

...

на початку мало пробілів.


Привіт і ласкаво просимо на сайт. На сьогоднішній день ваша відповідь - це переоцінка існуючих, а отже, нічого нового не додає. Ви можете покращити його, наприклад, пояснивши, як фільтрувати вихід, додавши пояснення того, що роблять різні перемикачі тощо
terdon

2

Ще один он-лайн-лайнер, натхненний цією відповіддю :

function a { read input;dpkg -l ${input} | grep " ${input} " | awk '{$1=$2=$3=$4="";print $0}' | sed 's/^ *//';unset input;};{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line $(echo $line | awk '{print $1}' | a )\n"; done;

Вихід має такий вигляд (кольоровий):

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8) Embedded GNU C Library: National Language (locale) data [support]
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Header files for Linux 3.2.0-4-amd64
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Common header files for Linux 3.2.0-4
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2) Provide limited super user privileges to specific users

Якщо ви не хочете короткого опису, скористайтеся цим:

{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line\n"; done;

Вихід:

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8)
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2)

Один вкладиш фантастичний, за винятком того, що він не видає опис деяких пакетів.
ychaouche

2
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

є найпростішим для електронних листів cron; немає ітерації користувача, а якщо немає оновлень, виходу немає.


1

Написавши попередження до відповіді @ Jasonwryan, я хочу надати власне рішення:

apt-get dist-upgrade --assume-no

На жаль, цей не працює з debian wheezy, і мені довелося перевірити деякі контейнери lxc, які досі не модернізовані. Ця форма завжди працюватиме:

apt-get dist-upgrade </dev/null

Нарешті, я також хотів переформатувати результат. Я вирішив змінити виклик ще раз (використовуючи, --dry-runале ігноруючи весь додатковий вихід), оскільки він відчуває себе більш безпечним:

apt-get --dry-run dist-upgrade | awk '
BEGIN{p=0}
/^The/{p=1;t=$0}
/no longer required/{p=0}
#optional: /been kept back/{p=0}
p && t{print t;t=""}
/^  / && p{print $0}
'

Повернення:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip

1

apt-check є, мабуть, найбільш ефективним сценарієм.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1

Дуже невелика модифікація показує вам лише оновлення безпеки.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2

0

Як варіант я використовую наступне:

apt-get -V -s dist-upgrade \
    |grep -E "^   .*=>.*" \
    |awk 'BEGIN {
        ul=sprintf("%*s",40,""); gsub(/ /,"-",ul);
        printf "%-30s %-30s %-30s\n", "Package", "Installed", "Available";
        printf "%-30.30s %-30.30s %-30.30s\n", ul, ul, ul;
     }
     {
        printf "%-30s %-30s %-30s\n",
               $1,
               substr($2,2),
               substr($4,1,length($4)-1)
     }'

Вставте його в сценарій з назвою, apt-updatesі тоді ви можете зателефонувати, apt-updatesщоб отримати список усіх оновлень незалежно від користувача.

Вам все одно потрібно телефонувати apt-get updateз привілейованим доступом.


Виведення показує лише ім'я пакета (перший стовпець), другий стовпець завжди друкує "=", а третій стовпчик завжди порожній. Я на Монетному дворі.
ychaouche


0

Мені подобається використовувати це:

apt-get -qq update && apt-get -qq -s upgrade

Ви отримуєте такий результат:

Inst linux-base [3.5] (4.5~deb8u1 Debian-Security:8/oldstable [all])
Conf linux-base (4.5~deb8u1 Debian-Security:8/oldstable [all])

якщо є доступні оновлення, і жодні, якщо їх немає. Таким чином, ви можете просто з'єднати його з моніторинговим рішенням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.