Ответы:
Для современных версий apt
есть специальный переключатель для этого:
apt list --upgradable
Для старой apt-get
команды -u
коммутатор показывает список пакетов, доступных для обновления:
# apt-get -u upgrade --assume-no
Со apt-get
страницы руководства :
-u
--show-upgradeed Показать обновленные пакеты; Распечатайте список всех пакетов, которые должны быть обновлены. Элемент конфигурации: APT :: Get :: Show-Upgraded.
--assume-no Автоматическое "нет" для всех запросов. <== Чтобы предотвратить запуск установки
-u
это вариант по умолчаниюapt-get
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
Надеюсь, это поможет кому-то еще,
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
Эта команда будет использовать aptitude для вывода новых пакетов, а затем 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, так и aptitude
apt-get update && apt-get -s upgrade
отобразит список доступных обновлений без фактической установки.
Первая команда обновляет индексные файлы пакета перед выполнением имитируемого (таким образом, -s) обновления. «-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
иметь только предпочитаемую информацию в вашем журнале.
Скорее всего, вам понадобится красивая часть после линии
...
Следующие пакеты будут обновлены:
...
в начале немного пробелов.
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)
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])
если есть доступные обновления, и нет, если нет. Таким образом, вы можете просто соединить его с решением для мониторинга.