web-dev-qa-db-fra.com

Lister les mises à jour disponibles mais ne pas les installer

Je souhaite que mon script de génération de rapports cron-run m'informe en cas de mise à jour de mes packages. Est-ce un moyen de faire apt-get donnez-moi la liste des mises à jour disponibles mais ne faites rien de plus?

231
Morris

apte

Pour les versions modernes de apt, il existe un commutateur spécifique pour cela:

apt list --upgradeable

apt-get

Pour l'ancien apt-get commande le -u switch affiche une liste des packages disponibles pour la mise à niveau:

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

Du apt-get page de manuel :

-u
- surclassé
 Afficher les packages mis à niveau; Imprimez une liste de tous les packages à mettre à niveau. Élément de configuration: APT :: Get :: Show-Upgraded.
--assumer-non "Non" automatique à toutes les invites. <== Pour l'empêcher de commencer l'installation
255
jasonwryan
apt-get --just-print upgrade

N'est pas lu aussi facilement, ci-dessous est un liner Perl pour analyser la sortie d'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"}'

Cela devrait produire quelque chose comme:

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

J'espère que cela aidera quelqu'un d'autre,

67
Tom

Une autre option, inspirée de l'enzotib:

aptitude search '~U' | wc -l

Cette commande utilisera aptitude pour sortir les nouveaux packages, puis wc pour simplement compter les lignes.

Sur un sidenote, j'ai trouvé que la solution d'enzotib sans les guillemets simples autour du ~U n'a pas fonctionné pour moi. (Wheezy, ZSH, aptitude 0.6.8.2)

Mise à jour:

Avec le nouvel apt, vous pouvez faire:

apt list --upgradeable

34
cete3

Le plus simple est:

apt list --upgradeable

27
AJM

Tu peux courir

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

ou les sans-papiers

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

Une autre méthode utilisant un apt-get simulation:

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

Jetez un œil au package "apticron":

apticron - Outil simple pour envoyer des e-mails sur les mises à jour de paquets en attente

Apticron est un script simple qui envoie quotidiennement des e-mails sur les mises à jour de packages en attente telles que les mises à jour de sécurité, gérant correctement les packages en attente à la fois par dselect et aptitude.

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

11
f4m8
apt-get update && apt-get -s upgrade

listera les mises à jour disponibles sans réellement les installer.

La première commande met à jour les fichiers d'index des packages avant la mise à niveau simulée (donc -s). "-s" effectuera une mise à niveau simulée montrant les paquets qui seraient installés mais n'installeront en fait rien.

Au contraire, "-u" au lieu de "-s" s'installerait en fait après confirmation.

10
ajaaskel

J'avais besoin d'informations complètes sur la version des mises à niveau possibles, j'ai donc utilisé une modification de la réponse de JasonWryan:

apt-get -V -u upgrade

C'est une sortie simple et IMO raisonnablement formatée.

9
Ben Brian

Il suffit de filtrer la sortie de

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

pour n'avoir que les informations préférées dans votre journal.

Très probablement, vous aurez besoin de la belle pièce après la ligne

...

Les packages suivants seront mis à niveau:

...

qui a peu d'espaces au début.

3
freealx

Jetez un autre sur-liner, inspiré par cette réponse :

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;

La sortie ressemble à ceci (en couleur):

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

Si vous ne voulez pas la courte description, utilisez celle-ci:

{ 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;

Production:

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)
2
Compilenix
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

est le plus simple pour les courriels cron; il n'y a pas d'itération utilisateur et s'il n'y a pas de mises à jour il n'y a pas de sortie.

2
user1133275

apt-check est probablement la méthode de script la plus efficace.

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

Une toute petite modification ne vous montre que les mises à jour de sécurité.

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

Après avoir écrit un avertissement à la réponse de @ jasonwryan, je veux fournir ma propre solution:

apt-get dist-upgrade --assume-no

Malheureusement, celui-ci ne fonctionne pas avec Debian Wheezy et j'ai dû vérifier certains conteneurs lxc qui ne sont toujours pas mis à niveau. Ce formulaire fonctionnera toujours:

apt-get dist-upgrade </dev/null

Enfin, je voulais également reformater la sortie. J'ai choisi de modifier à nouveau l'appel (en utilisant --dry-run mais en ignorant toutes les sorties supplémentaires) car cela semble plus sûr:

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}
'

Retour:

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

En variante, j'utilise ce qui suit:

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)
     }'

Collez-le dans un script nommé apt-updates et vous pouvez ensuite appeler apt-updates pour obtenir une liste de toutes les mises à jour, quel que soit l'utilisateur.

Vous devez toujours appeler apt-get update avec un accès privilégié.

0
Brett Ryan

Il y a le apt-show-versions outil. Pour afficher les mises à jour disponibles, exécutez:

apt-show-versions -u
0
agc

J'aime utiliser ceci:

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

Vous obtenez une sortie comme celle-ci:

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

s'il existe des mises à jour disponibles et aucune s'il n'y en a pas. De cette façon, vous pouvez simplement l'associer à une solution de surveillance.

0
user3310438