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?

Morris
quelle

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
jasonwryan
quelle
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,

Tom
quelle
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
cete3
quelle
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
AJM
quelle
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 }'
Enzotib
quelle
1
Dieser
Befähigungsbefehl
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

f4m8
quelle
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.

ajaaskel
quelle
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.

Ben Brian
quelle
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.

freealx
quelle
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)
Compilenix
quelle
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.

user1133275
quelle
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
Daniel Alder
quelle
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
Flackerfliege
quelle
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 .

Brett Ryan
quelle
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

Da ist das apt-show-versionsWerkzeug. So zeigen Sie verfügbare Aktualisierungen an:

apt-show-versions -u
agc
quelle
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.

user3310438
quelle