Antworten:
Für moderne Versionen apt
gibt es hierfür einen speziellen Schalter:
apt list --upgradable
Für den alten apt-get
Befehl -u
zeigt der Schalter eine Liste der Pakete an, die für ein Upgrade verfügbar sind:
# apt-get -u upgrade --assume-no
Von der apt-get
Manpage :
-u
--show-upgraded Aktualisierte Pakete anzeigen ; Drucken Sie eine Liste aller zu aktualisierenden Pakete aus. Konfigurationselement: APT :: Get :: Show-Upgraded.
--assume-no Automatisch "nein" zu allen Eingabeaufforderungen. <== Um zu verhindern, dass mit der Installation begonnen wird
-u
ist eine Standardoption vonapt-get
apt-get --just-print upgrade
Wird nicht so einfach gelesen, ist unten ein Perl-Einzeiler zum Parsen der Ausgabe von 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"}'
Dies sollte ungefähr so aussehen:
PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9
Hoffentlich wird es jemand anderem helfen,
column
wie 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
Eine weitere Option, inspiriert von Enzotib:
aptitude search '~U' | wc -l
Dieser Befehl verwendet aptitude, um die neuen Pakete auszugeben, und wc, um nur die Zeilen zu zählen.
In einer Randnotiz stellte ich fest, dass die Lösung von Enzotib ohne die einfachen Anführungszeichen um das ~ U bei mir nicht funktioniert. (Wheezy, ZSH, Eignung 0.6.8.2)
Update:
Mit dem neuen Apt können Sie jetzt Folgendes tun:
apt list --upgradable
Das einfachste ist:
apt list --upgradable
Du kannst rennen
aptitude -F%p --disable-columns search ~U
oder die undokumentiert
/usr/lib/update-notifier/apt-check -p; echo
Eine andere Methode unter Verwendung einer apt-get
Simulation:
apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
dist-upgrade
einige Pakete zu verlieren , aber ich brauche sie nicht, um sie zu verwenden aptitude
. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')
hat den Trick gemacht!
Schauen Sie sich das Paket "apticron" an:
apticron - Einfaches Tool zum Versenden von Nachrichten über ausstehende Paketaktualisierungen
Apticron ist ein einfaches Skript, das täglich E-Mails über ausstehende Paketaktualisierungen wie Sicherheitsaktualisierungen sendet und die von dselect und aptitude zurückgehaltenen Pakete ordnungsgemäß verarbeitet.
apt-get update && apt-get -s upgrade
listet verfügbare Updates auf, ohne sie tatsächlich zu installieren.
Der erste Befehl aktualisiert die Paketindexdateien, bevor das simulierte Upgrade (also -s) durchgeführt wird. "-s" führt ein simuliertes Upgrade durch, bei dem Pakete angezeigt werden, die installiert würden, aber tatsächlich nichts installieren.
Im Gegenteil, "-u" anstelle von "-s" würde nach Bestätigung tatsächlich installiert.
-s, --simulate, --just-print, --dry-run, --recon, --no-act
Aufklärung und Probelauf sind meine persönlichen Favoriten.
Filtern Sie einfach die Ausgabe von
apt-get update && apt-get -s -V -u upgrade
nur die bevorzugten Informationen in Ihrem Protokoll zu haben.
Wahrscheinlich brauchen Sie den schönen Teil nach der Linie
...
Die folgenden Pakete werden aktualisiert:
...
das hat am anfang wenig räume.
Jet einen weiteren Onliner, inspiriert von dieser Antwort :
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;
Die Ausgabe sieht wie folgt aus (farbig):
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
Wenn Sie die Kurzbeschreibung nicht möchten, verwenden Sie diese:
{ 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;
Ausgabe:
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 "
ist am einfachsten für Cron-E-Mails; Es gibt keine Benutzeriteration, und wenn keine Aktualisierungen vorhanden sind, erfolgt keine Ausgabe.
Nachdem ich eine Warnung an @ jasonwryans Antwort geschrieben habe, möchte ich meine eigene Lösung bereitstellen:
apt-get dist-upgrade --assume-no
Leider funktioniert dies nicht mit Debian Wheezy und ich musste einige lxc-Container überprüfen, die noch nicht aktualisiert wurden. Dieses Formular funktioniert immer:
apt-get dist-upgrade </dev/null
Schließlich wollte ich auch die Ausgabe neu formatieren. Ich habe mich dazu entschlossen, den Aufruf erneut zu ändern (wobei ich --dry-run
alle zusätzlichen Ausgaben ignoriert habe), weil es sich sicherer anfühlt:
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}
'
Kehrt zurück:
The following packages have been kept back:
iproute
The following packages will be upgraded:
unzip
apt-check
ist wahrscheinlich die effizienteste Skriptmethode.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1
Eine sehr kleine Änderung zeigt Ihnen nur die Sicherheitsupdates.
/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2
Als Variation verwende ich folgendes:
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)
}'
Wenn Sie es in ein Skript mit dem Namen apt-updates
einfügen, können Sie anrufen apt-updates
, um eine Liste aller Updates abzurufen, unabhängig vom Benutzer.
Sie müssen immer noch apt-get update
mit privilegiertem Zugriff anrufen .
Da ist das apt-show-versions
Werkzeug. So zeigen Sie verfügbare Aktualisierungen an:
apt-show-versions -u
Ich benutze das gerne:
apt-get -qq update && apt-get -qq -s upgrade
Sie erhalten eine Ausgabe wie diese:
Inst linux-base [3.5] (4.5~deb8u1 Debian-Security:8/oldstable [all])
Conf linux-base (4.5~deb8u1 Debian-Security:8/oldstable [all])
Wenn Updates verfügbar sind, und keine, wenn keine vorhanden sind. Auf diese Weise können Sie es einfach mit einer Überwachungslösung koppeln.