Перечислите доступные обновления, но не устанавливайте их


209

Я хочу, чтобы мой cron-скрипт создания отчетов уведомлял меня о наличии обновлений для моих пакетов. Можно ли заставить apt-getменя дать список доступных обновлений, но больше ничего не делать?

Ответы:


231

склонный

Для современных версий aptесть специальный переключатель для этого:

apt list --upgradable

APT-получить

Для старой apt-getкоманды -uкоммутатор показывает список пакетов, доступных для обновления:

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

Со apt-getстраницы руководства :

-u
--show-upgradeed
 Показать обновленные пакеты; Распечатайте список всех пакетов, которые должны быть обновлены. Элемент конфигурации: APT :: Get :: Show-Upgraded.
--assume-no  Автоматическое "нет" для всех запросов. <== Чтобы предотвратить запуск установки

2
Я надеялся, что это может быть сделано без рута
ThorSummoner

19
При вводе «Y» и нажмите Enter, эта команда будет устанавливать обновления. Я определенно рекомендовал бы добавить «-s», иначе этот ответ вводит в заблуждение
Murmel

5
Это очень неправильный ответ, потому что (без дополнительных опций) команда ожидает ввода, и если пользователь вводит неправильный ввод, пакет устанавливается, что изменяет систему, а не то, что хочет OP (только что произошло в моей системе)
Даниэль Олдер

И кстати: -uэто вариант по умолчаниюapt-get
Даниэль Олдер

1
@ThorSummoner '-s' будет делать то, что вы хотите, и работает без рута
nevelis

67
apt-get --just-print upgrade

Это не так просто прочитать, ниже приведена строка perl one для анализа вывода 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
просто для смеха: apt-get -s upgrade | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
тинк

8
Это также может быть намного columnapt-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
приятнее на

1
@AntonioK выглядит великолепно!
Ник

1
Боюсь, этот Perl-код взломает мою машину ...;)
Крис,

33

Другой вариант, вдохновленный энзотибом:

aptitude search '~U' | wc -l

Эта команда будет использовать aptitude для вывода новых пакетов, а затем wc просто посчитать строки.

По одному замечанию я обнаружил, что решение энзотиба без одинарных кавычек вокруг ~ U не работает для меня. (Wheezy, ZSH, способность 0.6.8.2)

Обновить :

С новым подходом вы можете сделать сейчас:

apt list --upgradable

Спасибо за это, команда apt list была именно тем, что я хотел.
Дворак

Приятно с этим решением, что вам не нужно sudo / root.
Gunni

25

Самый простой это:

apt list --upgradable

не работает на мяте.
17

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
Эта команда aptitude отлично работала для меня и не требовала root
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, так и aptitude

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


Ваша ссылка не работает ...
Алексис Уилк

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

отобразит список доступных обновлений без фактической установки.

Первая команда обновляет индексные файлы пакета перед выполнением имитируемого (таким образом, -s) обновления. «-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

Jet другой лайнер, вдохновленный этим ответом :

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)

Один вкладыш фантастический, за исключением того, что он не выводит описание некоторых пакетов.
17

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с привилегированным доступом.


Выходные данные показывают только имя пакета (первый столбец), второй столбец всегда печатает «=», а третий столбец всегда пуст. Я на монетном дворе.
17


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.