Liste verfügbare Updates auf, aber installiere sie nicht


209

Ich möchte, dass mein Cron-Run-Berichterstellungsskript mich benachrichtigt, falls Aktualisierungen für meine Pakete vorliegen. Kann apt-getich auf diese Weise eine Liste der verfügbaren Updates erhalten, ohne weitere Maßnahmen zu ergreifen?

Antworten:


231

geeignet

Für moderne Versionen aptgibt es hierfür einen speziellen Schalter:

apt list --upgradable

passend

Für den alten apt-getBefehl -uzeigt der Schalter eine Liste der Pakete an, die für ein Upgrade verfügbar sind:

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

Von der apt-getManpage :

-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

2
Ich hatte gehofft, dies könnte ohne root geschehen
ThorSummoner

19
Wenn Sie „Y“ und drücken Sie die Eingabetaste, dieser Befehl wird die Installation von Updates. Ich würde definitiv empfehlen, "-s" hinzuzufügen, sonst ist diese Antwort irreführend
Murmel

5
Dies ist eine sehr falsche Antwort , weil sie (ohne weitere Optionen) den Befehl wartet auf der Eingabe und wenn der Benutzer die falsche Eingabe eingegeben hat , wird das Paket installiert, die das System ändert , das ist nicht das, was die OP will (nur auf meinem System passiert)
Daniel Alder

Und übrigens: -uist eine Standardoption vonapt-get
Daniel Alder

1
@ThorSummoner '-s' wird tun, was Sie wollen und funktioniert ohne root
nevelis

67
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,


1
nur zum lachen: apt-get -s upgrade | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
Tink

8
Es könnte auch viel schöner aussehen, wenn Verwendung columnwie 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
folgt

1
@AntonioK Sieht gut aus!
Nick

1
Ich fürchte, dieser Perl-Code wird meine Maschine hacken ...;)
Chris

33

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

Vielen Dank dafür, der Befehl apt list war genau das, was ich wollte.
dvorak

Schön an dieser Lösung ist, dass Sie kein sudo / root benötigen.
Gunni,

25

Das einfachste ist:

apt list --upgradable

funktioniert nicht mit Minze.
Ychaouche

1
Es ist eine Schande, dass dies keine unterschiedlichen Exit-Codes zurückgibt, je nachdem, ob Upgrades verfügbar sind oder nicht. Wäre schön gewesen, dies in einem Skript verwenden zu können.
Dale Anderson

18

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-getSimulation:

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


apt-get -s dist-upgrade funktioniert auch gut und hat die gleiche Ausgabe, wenn Sie es durch diesen Acker leiten
Ychaouche

Dankeschön! das kam aus einer ziemlichen Hölle der Abhängigkeit. Ich habe versucht, dist-upgradeeinige 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!
Jayen

11

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.

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


Ihr Link ist kaputt ...
Alexis Wilke

10
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.


2
Die Simulationsoption kann mit einer der folgenden Optionen ausgelöst werden: -s, --simulate, --just-print, --dry-run, --recon, --no-actAufklärung und Probelauf sind meine persönlichen Favoriten.
ThorSummoner

9

Ich benötigte Vollversionsinformationen zu möglichen Upgrades und verwendete daher eine Modifikation von jasonwryans Antwort:

apt-get -V -u upgrade

Es ist einfach und die IMO-Ausgabe ist angemessen formatiert.


3

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.


Hallo und willkommen auf der Seite. So wie es aussieht, ist Ihre Antwort im Grunde eine Aufarbeitung der vorhandenen und fügt daher nichts Neues hinzu. Sie können es verbessern, indem Sie beispielsweise erläutern, wie die Ausgabe gefiltert wird, und erklären, was die verschiedenen Schalter usw. tun.
terdon

2

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)

Der eine Liner ist fantastisch, abgesehen davon, dass er nicht die Beschreibung einiger Pakete ausgibt.
Ychaouche

2
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.


1

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-runalle 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

1

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

0

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-updateseinfügen, können Sie anrufen apt-updates, um eine Liste aller Updates abzurufen, unabhängig vom Benutzer.

Sie müssen immer noch apt-get updatemit privilegiertem Zugriff anrufen .


Die Ausgabe zeigt nur den Paketnamen (erste Spalte), die zweite Spalte gibt immer "=" aus und die dritte Spalte ist immer leer. Ich bin auf Mint.
Ychaouche


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.