Відповіді:
Для сучасних версій для apt
цього є специфічний перемикач:
apt list --upgradable
Для старої apt-get
команди -u
перемикач показує список пакетів, доступних для оновлення:
# apt-get -u upgrade --assume-no
На apt-get
чоловіковій сторінці :
-u
- оновлення шоу-шоу Показ оновлених пакетів; Роздрукуйте список усіх пакетів, які потрібно оновити. Елемент конфігурації: APT :: Get :: Show-Upgraded.
--assume-немає Автоматичне "ні" для всіх підказок. <== Щоб запобігти його запуску
-u
є типовим варіантомapt-get
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
Сподіваємось, це допоможе комусь іншому,
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
Ще один варіант, натхнений ензотибом:
aptitude search '~U' | wc -l
Ця команда використовуватиме здатність для виведення нових пакетів, а потім wc для просто підрахунку рядків.
З боку, я виявив, що рішення ензотибу без єдиних лапок навколо ~ U не працює для мене. (Wheezy, ZSH, здатність 0.6.8.2)
Оновлення:
З новим підходом ви можете зараз:
apt list --upgradable
Найпростіший:
apt list --upgradable
Можна бігати
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 }'
dist-upgrade
але не втратити деякі пакунки, необхідні для використання aptitude
. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
зробив трюк!
Погляньте на упаковку "apticron":
apticron - простий інструмент для надсилання повідомлень про очікувані оновлення пакета
Apticron - це простий скрипт, який щодня надсилає електронні листи про очікувані оновлення пакета, такі як оновлення безпеки, належну обробку пакетів у режимі очікування як dselect, так і придатність.
apt-get update && apt-get -s upgrade
перелічить доступні оновлення без фактичної установки.
Перша команда оновлює індексні файли пакету, перш ніж буде виконано імітаційне (таким чином, -о) оновлення. "-s" зробить модельоване оновлення, показуючи пакети, які будуть встановлені, але насправді нічого не встановлять.
Навпаки, "-u" замість "-s" насправді встановиться після підтвердження.
-s, --simulate, --just-print, --dry-run, --recon, --no-act
-яким із моїх улюблених, реконструкція та сухий пробіг.
Мені потрібна повна інформація про версію щодо можливих оновлень, тому я використав модифікацію відповіді Jasonwryan:
apt-get -V -u upgrade
Це простий і IMO з розумом відформатований вихід.
Просто відфільтруйте вихід
apt-get update && apt-get -s -V -u upgrade
мати лише бажану інформацію у своєму журналі.
Швидше за все, вам знадобиться гарна частина після лінії
...
Наступні пакети будуть оновлені:
...
на початку мало пробілів.
Ще один он-лайн-лайнер, натхненний цією відповіддю :
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)
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "
є найпростішим для електронних листів cron; немає ітерації користувача, а якщо немає оновлень, виходу немає.
Написавши попередження до відповіді @ 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
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
Як варіант я використовую наступне:
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
з привілейованим доступом.
Там apt-show-versions
інструмент. Щоб показати доступні оновлення, виконайте:
apt-show-versions -u
Мені подобається використовувати це:
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])
якщо є доступні оновлення, і жодні, якщо їх немає. Таким чином, ви можете просто з'єднати його з моніторинговим рішенням.