Lister les mises à jour disponibles mais ne pas les installer


209

Je souhaite que mon script de création de rapports d'exécution cron me prévienne au cas où des mises à jour seraient disponibles pour mes paquets. Est-ce un moyen de apt-getme donner la liste des mises à jour disponibles sans rien faire de plus?

Réponses:


231

apte

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

apt list --upgradable

apt-get

Pour l'ancienne apt-getcommande, le -ucommutateur affiche une liste des packages disponibles pour la mise à niveau:

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

De la apt-getpage de manuel :

-u
--show-upgraded
 Afficher les packages mis à niveau; Imprimez une liste de tous les packages à mettre à niveau. Élément de configuration: APT :: Get :: Show-Upgraded.
--assume-no  "non" automatique à toutes les invites. <== Pour l'empêcher de commencer à installer

2
J'espérais que cela pourrait se faire sans racine
ThorSummoner

19
Si vous tapez « Y » et appuyez sur Entrée, cette commande va installer des mises à jour. Je recommanderais certainement d'ajouter "-s", sinon cette réponse est trompeuse
Murmel

5
C'est une très mauvaise réponse car (sans options supplémentaires), la commande attend une entrée et si l'utilisateur entre une mauvaise entrée, les paquetages sont installés, ce qui modifie le système, ce que l'OP ne souhaite pas (vient de se produire sur mon système)
Daniel Alder

Et d'ailleurs: -uest une option par défaut deapt-get
Daniel Alder

1
@ThorSummoner '-s' fera ce que vous voulez et fonctionne sans racine
nevelis

67
apt-get --just-print upgrade

N’est pas lu si facilement, en dessous se trouve une doublure en 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,


1
juste pour rire: apt-get -s upgrade | awk -F '[] [()] +' '/ Inst Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", 2 $, 3 $, 4 $}'
tink

8
Il pourrait également être beaucoup plus beau, si vous l'utilisez columncomme ceci: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 est superbe!
Nick

1
J'ai bien peur que ce code Perl pirate ma machine ...;)
Chris

33

Une autre option, inspirée par enzotib:

aptitude search '~U' | wc -l

Cette commande utilisera aptitude pour afficher les nouveaux packages, puis wc pour compter uniquement les lignes.

D'un côté, j'ai trouvé que la solution de enzotib sans les guillemets simples autour du ~ U ne fonctionnait pas pour moi. (Wheezy, ZSH, aptitude 0.6.8.2)

Mise à jour :

Avec le nouvel apt, vous pouvez faire maintenant:

apt list --upgradable

Merci pour cela, la commande apt list était exactement ce que je voulais.
dvorak

Bien avec cette solution, vous n’avez pas besoin de sudo / root.
Gunni

25

Le plus simple est:

apt list --upgradable

ne fonctionne pas à la menthe.
Ychaouche

1
C'est dommage que cela ne renvoie pas de codes de sortie différents selon que des mises à niveau sont disponibles ou non. Cela aurait été agréable de pouvoir utiliser cela dans un script.
Dale Anderson

18

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 une apt-getsimulation:

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

1
Cette commande d'aptitude a très bien fonctionné pour moi et ne nécessite pas de racine
JamesCW

apt-get -s dist-upgrade fonctionne bien aussi et a le même résultat lorsque vous la dirigez à travers cet awker
ychaouche

Merci! cela est sorti d'un peu de dépendance de l'enfer. essayait de dist-upgradene pas perdre certains paquets qu'il fallait utiliser aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')a fait le tour!
Jayen

11

Jetez un coup d'œil au paquet "apticron":

apticron - Un outil simple pour envoyer un mail sur les mises à jour de paquet en attente

Apticron est un script simple qui envoie des courriels quotidiens sur les mises à jour de paquets en attente, telles que les mises à jour de sécurité, et gère correctement les paquets en attente à la fois par dselect et par aptitude.

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


Votre lien est brisé ...
Alexis Wilke

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

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

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

Au contraire, "-u" au lieu de "-s" serait effectivement installé après confirmation.


2
L'option simuler peut être déclenchée avec n'importe lequel de ceux-ci -s, --simulate, --just-print, --dry-run, --recon, --no-act, mes tests personnels et les essais à sec sont mes favoris.
ThorSummoner

9

J'avais besoin d'informations complètes sur les mises à jour possibles. J'ai donc utilisé une modification de la réponse de jasonwryan:

apt-get -V -u upgrade

C’est une sortie simple et au format IMO raisonnablement formaté.


3

Il suffit de filtrer la sortie de

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

avoir uniquement les informations préférées dans votre journal.

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

...

Les paquets suivants seront mis à jour:

...

qui a peu d'espaces au début.


Bonjour et bienvenue sur le site. Dans l’état actuel des choses, votre réponse est fondamentalement une révision de celles existantes et n’ajoute donc rien de nouveau. Vous pouvez l’améliorer, par exemple, en expliquant comment filtrer la sortie, en ajoutant une explication sur le fonctionnement des différents commutateurs, etc.
terdon

2

Jet un autre on-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 description courte 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;

Sortie:

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)

La doublure est fantastique, sauf qu’elle n’affiche pas la description de certains paquets.
ychaouche

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

est le plus simple pour les emails 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.


1

Après avoir écrit un avertissement à la réponse de @ jasonwryan, je souhaite proposer 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 aussi reformater la sortie. J'ai choisi de changer à nouveau l'appel (en utilisant --dry-runmais en ignorant toutes les sorties supplémentaires) car il se sent plus en sécurité:

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

Résultats:

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

1

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 très petite modification ne vous montre que les mises à jour de sécurité.

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

0

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-updateset vous pourrez ensuite appeler apt-updatespour obtenir une liste de toutes les mises à jour, quel que soit l'utilisateur.

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


La sortie affiche uniquement le nom du package (première colonne), la deuxième colonne affiche toujours "=" et la troisième colonne est toujours vide. Je suis à la menthe.
ychaouche


0

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 y a des mises à jour disponibles et aucune s'il n'y en a pas. De cette façon, vous pouvez simplement le coupler avec une solution de surveillance.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.