Wyświetl dostępne aktualizacje, ale ich nie instaluj

208

Chcę, aby mój skrypt raportowania uruchamiany w trybie Cron powiadamiał mnie w przypadku aktualizacji moich pakietów. Czy to sposób, aby udostępnić apt-getmi listę dostępnych aktualizacji, ale nie robić nic więcej?

Morris
źródło

Odpowiedzi:

231

trafny

W nowoczesnych wersjach aptdostępny jest specjalny przełącznik:

apt list --upgradable

apt-get

W przypadku starego apt-getpolecenia -uprzełącznik wyświetla listę pakietów dostępnych do aktualizacji:

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

Od apt-getstrony man :

-u
--show-upgrade
 Pokaż zaktualizowane pakiety; Wydrukuj listę wszystkich pakietów, które mają zostać zaktualizowane. Element konfiguracji: APT :: Get :: Show-Upgraded.
--assume-no  Automatyczne „nie” dla wszystkich podpowiedzi. <== Aby zapobiec rozpoczęciu instalacji
jasonwryan
źródło
2
Miałem nadzieję, że da się to zrobić bez
rootowania
19
Jeśli wpiszesz „Y” i naciśnij klawisz Enter, to polecenie będzie instalować aktualizacje. Zdecydowanie poleciłbym dodać „-s”, w przeciwnym razie ta odpowiedź jest myląca
Murmel
5
To bardzo zła odpowiedź, ponieważ (bez dodatkowych opcji) polecenie czeka na dane wejściowe, a jeśli użytkownik wprowadzi nieprawidłowe dane, pakiet zostanie zainstalowany, co zmodyfikuje system, który nie jest tym, czego chce OP (właśnie stało się w moim systemie)
Daniel Alder,
A btw: -ujest domyślną opcjąapt-get
Daniel Alder
1
@ThorSummoner '-s' zrobi to, co chcesz i działa bez
rootowania
67
apt-get --just-print upgrade

Nie czyta się tak łatwo, poniżej znajduje się jeden linijka perla do analizy danych wyjściowych 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"}'

Powinno to wygenerować coś takiego:

PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9

Mam nadzieję, że pomoże to komuś innemu,

Tomek
źródło
1
tylko dla śmiechu: aktualizacja apt-get -s | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", 2 $, 3 $, 4 $}
tink
8
Może być również columnapt-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
ładniejszy
1
@AntonioK Wygląda świetnie!
nick
1
Obawiam się, że ten kod Perla zhakuje moją maszynę ...;)
Chris
33

Inna opcja, zainspirowana przez enzotib:

aptitude search '~U' | wc -l

To polecenie użyje aptitude do wypisania nowych pakietów, a następnie wc do zliczenia linii.

Z jednej strony stwierdziłem, że rozwiązanie enzotibu bez pojedynczych cudzysłowów wokół ~ U nie działa dla mnie. (Wheezy, ZSH, aptitude 0.6.8.2)

Aktualizacja :

Dzięki nowemu apt możesz teraz:

apt list --upgradable
cete3
źródło
Dzięki za to polecenie apt list było dokładnie tym, czego chciałem.
dvorak
Fajne z tym rozwiązaniem jest to, że nie potrzebujesz sudo / roota.
Gunni
25

Najłatwiej jest:

apt list --upgradable
AJM
źródło
nie działa na miętę.
ychaouche
1
Szkoda, że ​​nie zwraca różnych kodów wyjścia w zależności od tego, czy są dostępne aktualizacje, czy nie. Byłoby miło móc użyć tego w skrypcie.
Dale Anderson
18

Możesz biegać

aptitude -F%p --disable-columns search ~U

lub nieudokumentowane

/usr/lib/update-notifier/apt-check -p; echo

Inna metoda wykorzystująca apt-getsymulację:

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
enzotib
źródło
1
Ta komenda umiejętności działała dla mnie świetnie i nie wymagała
rootowania
apt-get -s dist-upgrade również działa dobrze i ma tę samą wydajność, gdy przepuszczasz go przez tego awkera
ychaouche
Dziękuję Ci! wyszło to z dość piekła zależności. próbował dist-upgradezgubić niektóre pakiety, które były tak potrzebne aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')wykonał lewę!
Jayen
11

Spójrz na pakiet „apticron”:

apticron - Proste narzędzie do wysyłania wiadomości e-mail o oczekujących aktualizacjach pakietów

Apticron to prosty skrypt, który wysyła codzienne wiadomości e-mail na temat oczekujących aktualizacji pakietów, takich jak aktualizacje zabezpieczeń, poprawnie obsługując pakiety wstrzymane zarówno przez dselect, jak i aptitude.

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

f4m8
źródło
Twój link jest zepsuty ...
Alexis Wilke
10
apt-get update && apt-get -s upgrade

wyświetli listę dostępnych aktualizacji bez faktycznej instalacji.

Pierwsze polecenie aktualizuje pliki indeksu pakietu przed przeprowadzeniem symulowanej (a więc -s) aktualizacji. „-s” wykona symulowaną aktualizację pokazującą pakiety, które zostaną zainstalowane, ale w rzeczywistości niczego nie zainstalują.

Wręcz przeciwnie, „-u” zamiast „-s” faktycznie instaluje się po potwierdzeniu.

ajaaskel
źródło
2
Opcja symulacji może zostać uruchomiona za pomocą dowolnego z -s, --simulate, --just-print, --dry-run, --recon, --no-act, rekonfiguracja i uruchomienie na sucho są moimi osobistymi ulubionymi.
ThorSummoner,
9

Potrzebowałem informacji o pełnej wersji możliwych aktualizacji, więc użyłem modyfikacji odpowiedzi Jasonwryana:

apt-get -V -u upgrade

To proste i odpowiednio sformatowane wyjście IMO.

Ben Brian
źródło
3

Po prostu odfiltruj dane wyjściowe

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

mieć w rejestrze tylko preferowane informacje.

Najprawdopodobniej będziesz potrzebować pięknej części po linii

...

Następujące pakiety zostaną zaktualizowane:

...

ma na początku niewiele spacji.

freealx
źródło
Witam i witam na stronie. W obecnej formie twoja odpowiedź jest w zasadzie powtórką istniejących, więc nie dodaje niczego nowego. Możesz to poprawić, na przykład wyjaśniając, jak filtrować dane wyjściowe, dodając wyjaśnienie, co robią różne przełączniki itp.
terdon
2

Odrzutowiec on-line zainspirowany tą odpowiedzią :

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;

Dane wyjściowe wyglądają następująco (w kolorze):

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

Jeśli nie chcesz tego krótkiego opisu, użyj tego:

{ 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;

Wynik:

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
źródło
Jedna linijka jest fantastyczna, ale nie wyświetla opisu niektórych pakietów.
ychaouche
2
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

jest najprostszy dla wiadomości e-mail Cron; nie ma iteracji użytkownika, a jeśli nie ma aktualizacji, nie ma danych wyjściowych.

użytkownik1133275
źródło
1

Po napisaniu ostrzeżenia do odpowiedzi @ jasonwryan chcę podać własne rozwiązanie:

apt-get dist-upgrade --assume-no

Niestety, ten nie działa z serwerem Debian Wheezy i musiałem sprawdzić kilka kontenerów LXC, które wciąż nie są uaktualnione. Ten formularz zawsze będzie działał:

apt-get dist-upgrade </dev/null

Wreszcie chciałem również sformatować dane wyjściowe. Zdecydowałem się zmienić połączenie ponownie (używając, --dry-runale ignorując wszystkie dodatkowe dane wyjściowe), ponieważ wydaje się to bezpieczniejsze:

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

Zwroty:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip
Daniel Alder
źródło
1

apt-check jest prawdopodobnie najbardziej wydajną metodą skryptową.

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

Bardzo mała modyfikacja pokazuje tylko aktualizacje zabezpieczeń.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2
Flickerfly
źródło
0

Jako wariant używam następujących:

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

Wstaw go do skryptu o nazwie, apt-updatesa następnie możesz zadzwonić, apt-updatesaby uzyskać listę wszystkich aktualizacji bez względu na użytkownika.

Nadal musisz dzwonić apt-get updatez uprzywilejowanym dostępem.

Brett Ryan
źródło
dane wyjściowe pokazują tylko nazwę pakietu (pierwsza kolumna), druga kolumna zawsze wypisuje „=”, a trzecia kolumna jest zawsze pusta. Jestem na Mennicy.
ychaouche
0

Lubię to używać:

apt-get -qq update && apt-get -qq -s upgrade

Otrzymasz wyjście takie jak to:

Inst linux-base [3.5] (4.5~deb8u1 Debian-Security:8/oldstable [all])
Conf linux-base (4.5~deb8u1 Debian-Security:8/oldstable [all])

jeśli są dostępne aktualizacje, a żadna, jeśli nie ma. W ten sposób możesz po prostu połączyć go z rozwiązaniem monitorującym.

użytkownik3310438
źródło