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?
Pour les versions modernes de apt
, il existe un commutateur spécifique pour cela:
apt list --upgradeable
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
-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
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,
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
Le plus simple est:
apt list --upgradeable
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 }'
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.
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.
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.
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.
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)
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.
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
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
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é.
Il y a le apt-show-versions
outil. Pour afficher les mises à jour disponibles, exécutez:
apt-show-versions -u
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.