Jak mogę zainstalować tylko aktualizacje bezpieczeństwa z wiersza poleceń?

333

sudo apt-get upgradeinstaluje wszystkie aktualizacje, nie tylko aktualizacje bezpieczeństwa. Wiem, że mogę używać Menedżera aktualizacji, aby wybierać tylko ważne aktualizacje zabezpieczeń, ale czy można to zrobić z wiersza polecenia?

Michael Crenshaw
źródło
2
Nie wydaje mi się dist-upgrade przenosi cały system do nowej wersji. Mówię o codziennych aktualizacjach, takich jak te, które widzisz w Menedżerze aktualizacji.
Michael Crenshaw
1
Och, rozumiem co teraz mówisz. Heh, tak często uruchamiam aktualizację apt-get, piszę ją bez zastanowienia. Dzięki za heads-up!
Michael Crenshaw
7
Chcesz „apt-get dist-upgrade”, a nie „apt-get upgrade”. „dist-upgrade” nie jest dla nowych wydań (to jest „do-release-upgrade” osobne polecenie). Użycie „dist-upgrade” oznacza, że ​​będzie on obsługiwał zmieniające się zależności nowych pakietów. To może być ważne.
Kees Cook
3
dist-upgrade to normalna operacja wykonywana przez GUI programu Update Manager. W przypadku pakietów, takich jak jądro, w którym znajduje się linux-image-genericpakiet, w zależności od bieżącego obrazu, np. linux-image-3.x.y-zz-generic(Każda wersja to osobna nazwa pakietu), dist-upgrade (umożliwiający instalację nowych pakietów w celu spełnienia zależności) przeprowadzi tę aktualizację , podczas gdy aktualizacja pokaże pakiet jądra jako wstrzymany.
chronitis
3
Zaskakujące, że nie ma na to dobrych dobrych apt-getodpowiedzi, biorąc pod uwagę, jak wyraźnie jest ono wymienione na każdym serwerze
Karthik T

Odpowiedzi:

308

Pakiet aktualizacji nienadzorowanych zapewnia funkcję automatycznego instalowania aktualizacji zabezpieczeń.

Możesz użyć tego, ale zamiast konfigurować automatyczną część, możesz wywołać ją ręcznie:

sudo unattended-upgrade -d --dry-run
sudo unattended-upgrade -d

Jeśli zamiast tego chcesz uruchomić go cicho:

sudo unattended-upgrade

UWAGA: Kiedy wywołujesz aktualizację nienadzorowaną, pozostawiasz „s” poza końcem.

Zakłada się, że pakiet jest instalowany domyślnie, co prawdopodobnie jest. Jeśli nie, po prostu wykonaj:

sudo apt-get install unattended-upgrades

Zobacz także /usr/share/doc/unattended-upgrades/README.md.

niebieskawy
źródło
Aby wyłączyć automatyczne wykonywanie unattended-upgrade, prawdopodobnie musisz to zmienić /etc/cron.daily/apt, ale nie jesteś pewien, czy jest to „poprawne”
Jaime Hablutzel,
uwaga dodatkowa: dla serwera LTS Ubuntu 12.04.5 unattended-upgradesnie jest instalowany domyślnie.
Raptor
13
Ponieważ robisz to z wiersza poleceń, używaj -vdo wiadomości informacyjnych lub -ddo debugowania wiadomości. W przeciwnym razie narzędzie będzie bardzo ciche, w takim przypadku musisz sprawdzić logi /var/log/unattended-upgrades. Możesz także użyć --dry-rundo symulacji, ale w rzeczywistości niczego nie ulepszać. Aby uzyskać więcej informacji i inne opcje, użyj, --helpaby uzyskać komunikat pomocy.
ADTC
nauczyłem się unattended-upgradesdzisiaj kilku rzeczy . dzięki!
the0ther
„do monitorowania, jak to działa”, to tylko debugowanie nieinteraktywnych wiadomości, prawda?
Wodnik Moc
116

Kilka wskazówek na temat zarządzania aktualizacjami

Dotyczy to zarówno Debiana, jak i Ubuntu, ale bardziej szczegółowe instrukcje dotyczące Ubuntu są następujące.

  • Pokaż tylko aktualizacje zabezpieczeń:

    apt-get -s dist-upgrade |grep "^Inst" |grep -i securi 
    

    lub

    sudo unattended-upgrade --dry-run -d
    

    lub

    /usr/lib/update-notifier/apt-check -p
    
  • Pokaż wszystkie pakiety z możliwością aktualizacji

    apt-get -s dist-upgrade | grep "^Inst"
    
  • Instaluj tylko aktualizacje zabezpieczeń

    apt-get -s dist-upgrade | grep "^Inst" | 
        grep -i securi | awk -F " " {'print $2'} | 
        xargs apt-get install
    

Uwagi:

  • Czasami Ubuntu pokazuje aktualizacje bezpieczeństwa, jakby pochodziły z repozytorium $ release-updates. Tak jest, powiedziano mi, ponieważ programiści Ubuntu pchają również aktualizacje bezpieczeństwa do repozytorium $ release-updates, aby przyspieszyć ich dostępność.

    W takim przypadku możesz wykonać następujące czynności, aby wyświetlić tylko aktualizacje zabezpieczeń:

    sudo sh -c 'grep ^deb /etc/apt/sources.list | 
        grep security > /etc/apt/sources.security.only.list'
    

    i

    apt-get -s dist-upgrade -o Dir::Etc::SourceList=/etc/apt/sources.security.only.list -o Dir::Etc::SourceParts=/dev/null  | 
        grep "^Inst" | awk -F " " {'print $2'}
    
  • Sprawdź, jakie usługi należy zrestartować po aktualizacji pakietu. Dowiedz się wcześniej, jakie pakiety zamierzasz zaktualizować i zaplanuj ponowne uruchomienie / ponowne uruchomienie. Problem polega na tym, że dopóki nie uruchomisz ponownie usługi, nadal może korzystać ze starszej wersji biblioteki (najczęstszy powód), która została załadowana do pamięci przed zainstalowaniem nowego pakietu, który naprawia lukę w zabezpieczeniach lub cokolwiek innego.

    checkrestart -v
    

    Należy jednak pamiętać, że checkrestartmoże zawierać listę procesów, które niekoniecznie muszą zostać ponownie uruchomione. Na przykład usługa PostgreSQL może przechowywać w pamięci odniesienie do już usuniętego pliku xlog, co nie jest prawidłowym powodem do ponownego uruchomienia usługi.

    Dlatego innym, bardziej niezawodnym sposobem sprawdzenia tego za pomocą standardowych narzędzi jest następujący skrypt bash, który bezwstydnie ukradłem z https://locallost.net/?p=233

    Sprawdza, czy uruchomione procesy w systemie nadal używają usuniętych bibliotek, dzięki zachowaniu kopii tych w aktywnej pamięci.

    ps xh -o pid |
    while read PROCID; do
           grep 'so.* (deleted)$' /proc/$PROCID/maps 2> /dev/null
           if [ $? -eq 0 ]; then
                   CMDLINE=$(sed -e 's/\x00/ /g' < /proc/$PROCID/cmdline)
                   echo -e "\tPID $PROCID $CMDLINE\n"
           fi
    done
    
ILIV
źródło
1
Dopiero teraz zauważam ten post. To jest bardzo precyzyjne.
Wielkie
skąd pochodzi „checkrestart”? Nie mogę go znaleźć w Ubuntu Trusty. Znalazłem „needrestart”, który wygląda jakby pasował do twoich instrukcji?
Ben XO,
Można go znaleźć w pakiecie debian-goodies: packages.debian.org/wheezy/debian-goodies . Istnieje również potrzeba ponownego uruchomienia. Możesz znaleźć oba na Xenial, uruchamiając: $ apt-cache search checkrestart
ILIV
Dostaję komunikat „E: Nie można otworzyć pliku blokady / var / lib / dpkg / lock - open (13: Odmowa dostępu)” nawet z sudo. Czy jest to coś specyficznego dla jednej z aktualizacji lub podanych poleceń?
Nathan Hornby
Najprawdopodobniej chodzi o niepoprawne / nieprawidłowe zakończenie dpkg, które spowodowało, że plik blokady nie został wyczyszczony. Nie dzieje się to normalnie, dopóki np. Instalacja pakietu nie zakończy się pomyślnie (pełny dysk itp.) Prawdopodobnie nie możesz uruchomić innych poleceń apt-get i dpkg, prawda?
ILIV
46

zamień /etc/apt/preferencesna:

Package: *
Pin: release a=lucid-security
Pin-Priority: 500

Package: *
Pin: release o=Ubuntu
Pin-Priority: 50

teraz prosty apt-get upgradezaktualizuje tylko wszystkie aktualizacje zabezpieczeń.

Dlaczego (i jak) to działa: Plik preferencji przypina wszystkie pakiety z dystrybucji Ubuntu do priorytetu 50, co czyni je mniej pożądanymi niż pakiety już zainstalowane. Pliki pochodzące z repozytorium zabezpieczeń mają domyślny priorytet (500), więc są rozważane do instalacji. Oznacza to, że tylko pakiety uważane za bardziej pożądane niż obecnie zainstalowane są aktualizacjami zabezpieczeń. Więcej informacji o przypinaniu na stronie apt_preferences .

Możesz tymczasowo promować określoną dystrybucję aktualizacji z --target-releaseopcją, która działa z ( apt-geti aptitudeprzynajmniej), która pozwoli przypiąć określone wydania, aby kwalifikowały się do aktualizacji.

Jeśli chcesz używać tego tylko do skryptów i nie ustawiać go jako domyślnego dla systemu, możesz umieścić reguły w innej lokalizacji i użyć tego:

apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade

Spowoduje to, że apt będzie szukał pliku preferencji z lokalizacji innej niż domyślna.

Plik preferencji podany jako przykład nie ma zastosowania do repozytoriów stron trzecich, jeśli też chcesz je przypiąć, możesz apt-cache policyłatwo użyć wymaganych kluczy do przypięcia.

Ressu
źródło
Dziękujemy za poświęcenie czasu na dokładną odpowiedź. Myślę , że rozumiem, jak to działa. Ale kiedy tworzę plik / etc / apt / preferencje i uruchamiam apt-get upgrade, chce zaktualizować wszystkie pakiety, a nie tylko aktualizacje bezpieczeństwa. Aktualizacja listy przed i po jest dokładnie taka sama, z wyjątkiem preferencji / etc / apt /, że nie chce aktualizować Leafpada, który zbudowałem ze źródła i zainstalowałem „ręcznie” z dpkg. To dla mnie bardzo dziwne, ale może ci coś znaczyć.
Michael Crenshaw,
1
Możesz zobaczyć, co się dzieje z poleceniem strategii apt-cache. Wybierz jeden z pakietów, który nie otrzymuje poprawki bezpieczeństwa i uruchom apt-cache policy packagename. Spowoduje to wyświetlenie listy priorytetów dla różnych wersji. Powinieneś zobaczyć różne linie i różne priorytety. Jeśli nie ma linii o priorytecie 50, przypinanie z jakiegoś powodu nie wpływa na dane pakiety.
Ressu
1
W przeszłości śledziłem tę odpowiedź. Dzisiaj dowiedziałem się, że z powodu tej odpowiedzi 68 pakietów aktualizacji zabezpieczeń NIE zostało zainstalowanych na moim serwerze i nie pojawiło się jako potencjalne kandydatury do instalacji. To NIE JEST DOBRA ODPOWIEDŹ!
Odcień
12

Następujące informacje znajdują potwierdzenie w Ubuntu 14.04 LTS.

Skorzystaj z unattended-upgradepakietu.

Spójrz na plik /etc/apt/apt.conf.d/50unattended-upgrades. Na górze powinna znajdować się sekcja:

// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
//  "${distro_id}:${distro_codename}-updates";
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};

Zwróć uwagę, jak został skonfigurowany, aby domyślnie dopuszczać tylko nienadzorowane aktualizacje pakietów bezpieczeństwa.

Zmodyfikuj plik /etc/apt/apt.conf.d/10periodicpodobny do:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Spowoduje to uruchomienie automatycznych nienadzorowanych aktualizacji zabezpieczeń, raz dziennie.

Teraz, aby uruchomić ręcznie: sudo unattended-upgrade.

Aby przetestować za sucho, nie robiąc nic: sudo unattended-upgrade --dry-run.

Źródło: https://help.ubuntu.com/14.04/serverguide/automatic-updates.html

Vcardillo
źródło
Czy istnieje sposób, aby uczynić to harmonogramem miesięcznym?
mike.b93
1
@ mike.b93, myślę, że ustawienie APT::Periodic::Unattended-Upgrade "30";to zrobiłoby - co 30 dni.
vcardillo
5

Chociaż jest to dość brzydkie, możesz wyłączyć wszystkie repozytoria oprócz repozytorium zabezpieczeń, a następnie:

sudo apt-get update && sudo apt-get upgrade

Nie testowałem tego, ale teoretycznie znajdzie tylko aktualizacje w repozytorium zabezpieczeń i zastosuje je ...

Stephen RC
źródło
Tak, jest taka możliwość. Przyjrzę się temu. Nie jestem dobry w BASH, ale mogę spróbować stworzyć skrypt, aby to zrobić.
Michael Crenshaw,
OK, wyłączyłem wszystkie oprócz repozytoriów bezpieczeństwa Ubuntu i uruchomiłem sudo apt-get update && sudo apt-get upgrade(anulowanie przed wykonaniem jakichkolwiek aktualizacji). Następnie ponownie włączyłem wszystkie moje repozytorium, uruchomiłem sudo apt-get updateei otworzyłem Menedżera aktualizacji. Pakiety oznaczone jako aktualizacje zabezpieczeń nie były dokładnie tym, co apt-get upgradeznaleziono, ale były bardzo blisko - wystarczająco blisko dla mnie. Nadal chciałbym wiedzieć dokładnie, jak to robi Menedżer aktualizacji i jak zrobić to samo z wiersza polecenia, ale tak się stanie. Dzięki!
Michael Crenshaw,
3
  • apt-get update: wystarczy przeczytać wpisy w repozytorium - zgodnie z istniejącą listą. Musiałem sprawdzić, co nowego.
  • apt-get upgrade: wszystkie aktualizacje dla zainstalowanych pakietów bez modułów jądra. Brak aktualizacji wydania.
  • apt-get dist-upgrade: wszystkie aktualizacje dla zainstalowanych pakietów również z modułami jądra. Brak aktualizacji wydania.
  • apt-getz parametrem -s: tylko test, bez zmian.
utrwalacz
źródło
0

W Debianie używam tego polecenia do robienia tylko aktualizacji bezpieczeństwa:

apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )
naciśnięcie klawisza
źródło
0

Nie mogę znaleźć opcji ani apt-get, ani aptitude, jednak ktoś miał takie samo pytanie na SuperUser. Jedyną odpowiedzią jest:

Check and adjust /etc/apt/apt.conf.d/50unattended-upgrade. 
Did you replace 'karmic' with the code name of your Ubuntu?

Brak odpowiedzi na pytanie, czy to zadziałało.

Ross
źródło
2
Wygląda na to, że metoda opisana na tej stronie wiki zależy od ustawienia argumentu apttett-release na <release> -security. Podobnie jak OP tego pytania, ta metoda instaluje wszystkie aktualizacje, nie tylko aktualizacje bezpieczeństwa. Czytając strony podręcznika apt-get i aptitude, nie sądzę, aby argument --target-release miał na celu ograniczenie aktualizacji tylko do bezpieczeństwa, chociaż nie jestem pewien, do czego to służy .
Michael Crenshaw,
0

Oto skrypt, który osiąga to na kilka różnych sposobów:

#!/usr/bin/env bash
set -e

# List upgradable packages
apt-get update
apt list --upgradable 2>/dev/null
# List security upgrades
test "$(apt-get upgrade -s -y)" && (apt-get upgrade -s -y)
# List upgradable apt packages then upgrade
apt-get update && apt-get upgrade -y  -V | grep '=>' | awk '{print$1}' && test "$(apt-get upgrade -y)"
Seth Bergman
źródło