Comment puis-je installer uniquement les mises à jour de sécurité à partir de la ligne de commande?

333

sudo apt-get upgradeinstalle toutes les mises à jour, pas seulement les mises à jour de sécurité. Je sais que je peux utiliser Update Manager pour sélectionner uniquement les mises à jour de sécurité importantes, mais existe-t-il un moyen de le faire à partir de la ligne de commande?

Michael Crenshaw
la source
2
Je ne pense pas. dist-upgrade prend le système entier à une nouvelle version. Je parle de mises à jour quotidiennes, comme celles que vous voyez dans Update Manager.
Michael Crenshaw
1
Oh, je vois ce que tu dis maintenant. Heh, je lance apt-get update si souvent que je le tape sans réfléchir. Merci pour l'information!
Michael Crenshaw
7
Vous voulez "apt-get dist-upgrade", pas "apt-get upgrade". "dist-upgrade" ne s'applique pas aux nouvelles versions (il s'agit d'une commande distincte de "do-release-upgrade"). Utiliser "dist-upgrade" signifie qu'il va gérer les dépendances changeantes des nouveaux paquets. Cela peut être important
Kees Cook
3
dist-upgrade est l'opération normale effectuée par l'interface graphique d'Update Manager. Pour les paquetages tels que le noyau où il y a un linux-image-genericpaquetage, en fonction de l'image actuelle, par exemple linux-image-3.x.y-zz-generic(chaque version est un nom de paquetage distinct), dist-upgrade (qui permet d'installer de nouveaux paquetages pour satisfaire les dépendances) effectuera cette mise à jour , alors que upgrade affichera le paquet du noyau comme étant retenu.
chronite
3
Surprenant qu'il n'y ait pas de bonne apt-getréponse à cela, vu sa visibilité sur chaque serveur
Karthik T

Réponses:

308

Le paquet Unattended-upgrades fournit une fonctionnalité pour installer automatiquement les mises à jour de sécurité.

Vous pouvez l'utiliser, mais au lieu de configurer la pièce automatique, vous pouvez l'appeler manuellement:

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

Si vous voulez le faire tranquillement à la place:

sudo unattended-upgrade

REMARQUE: lorsque vous appelez unattended-upgrade, vous laissez le "s" de côté.

Cela suppose que le paquet est installé par défaut, ce qui est probablement le cas. Si non, il suffit de faire:

sudo apt-get install unattended-upgrades

Voir aussi /usr/share/doc/unattended-upgrades/README.md.

blueyed
la source
Pour désactiver l'exécution automatique, unattended-upgradevous devez probablement modifier /etc/cron.daily/apt, mais vous n'êtes pas sûr que ce soit "correct"
Jaime Hablutzel,
note latérale: pour le serveur Ubuntu 12.04.5 LTS, unattended-upgradesn’est pas installé par défaut.
Raptor
13
Comme vous le faites depuis la ligne de commande, utilisez-le -vpour les messages d’information ou -dpour les messages de débogage. Sinon, l'utilitaire sera très silencieux, auquel cas vous devrez vérifier les journaux /var/log/unattended-upgrades. Vous pouvez également utiliser --dry-runpour simuler mais pas réellement mettre à niveau quoi que ce soit. Pour plus d'informations et d'autres options, utilisez --helppour obtenir le message d'aide.
ADTC
J'ai appris quelques choses sur unattended-upgradesaujourd'hui. Merci!
the0ther
"pour surveiller comment ça se passe", il suffit de déboguer des messages non interactifs, n'est-ce pas?
Aquarius Power
116

Quelques conseils sur la gestion des mises à jour

Ceci s'applique à la fois à Debian et à Ubuntu, mais des instructions plus spécifiques pour Ubuntu suivent.

  • Afficher les mises à jour de sécurité uniquement:

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

    ou

    sudo unattended-upgrade --dry-run -d
    

    ou

    /usr/lib/update-notifier/apt-check -p
    
  • Afficher tous les packages pouvant être mis à jour

    apt-get -s dist-upgrade | grep "^Inst"
    
  • Installer les mises à jour de sécurité uniquement

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

Remarques:

  • Parfois, Ubuntu affiche les mises à jour de sécurité comme si elles provenaient du référentiel $ release-updates. C'est vrai, me dit-on, car les développeurs Ubuntu transfèrent également les mises à jour de sécurité dans le référentiel $ release-updates pour accélérer leur disponibilité.

    Si tel est le cas, vous pouvez procéder comme suit pour afficher uniquement les mises à jour de sécurité:

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

    et

    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'}
    
  • Vérifiez quels services doivent être redémarrés après les mises à niveau du paquet. Déterminez quels packages vous allez mettre à niveau au préalable et planifiez vos redémarrages / redémarrages. Le problème ici est que si vous ne redémarrez pas un service, il se peut que votre ancienne version d'une bibliothèque (raison la plus courante) ait été chargée en mémoire avant l'installation du nouveau package qui corrige une faille de sécurité.

    checkrestart -v
    

    Cependant, gardez à l’esprit que des checkrestartprocessus peuvent ne pas nécessairement être redémarrés. Par exemple, le service PostgreSQL peut conserver dans sa mémoire une référence à un fichier xlog déjà supprimé, ce qui n’est pas une raison valable pour redémarrer le service.

    Par conséquent, un autre moyen, plus fiable, de vérifier cela à l’aide d’utils standard est le petit script bash suivant que j’ai volé sans vergogne à https://locallost.net/?p=233

    Il vérifie si les processus en cours sur un système utilisent toujours des bibliothèques supprimées en conservant des copies de celles-ci en mémoire active.

    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
la source
1
Je remarque seulement maintenant ce post. C'est extrêmement précis. Merci beaucoup (+1)
Danduk82
d'où vient 'checkrestart'? Je ne le trouve pas dans Ubuntu Trusty. J'ai trouvé "needrestart" qui semble correspondre à vos instructions?
Ben XO
On peut le trouver dans le paquet debian-goodies: packages.debian.org/wheezy/debian-goodies . Il y a aussi besoin de redémarrer. Vous pouvez trouver les deux sur Xenial en exécutant: $ apt-cache search checkrestart
ILIV
J'obtiens "E: Impossible d'ouvrir le fichier de verrouillage / var / lib / dpkg / lock-open (13: L'autorisation est refusée)" même avec sudo. Est-ce quelque chose de spécifique à l'une des mises à jour ou aux commandes que vous avez fournies?
Nathan Hornby
Très probablement, il s’agit d’une fin incorrecte / anormale de dpkg qui a laissé un fichier de verrouillage non effacé. Cela ne se produit normalement que lorsque, par exemple, l'installation d'un paquet ne se termine pas correctement (disque complet, etc.). Vous ne pouvez probablement pas exécuter d'autres commandes apt-get et dpkg, n'est-ce pas?
ILIV
46

remplacer /etc/apt/preferencespar ce qui suit:

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

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

Désormais, un simple apt-get upgrademettra à niveau uniquement toutes les mises à jour de sécurité.

Pourquoi (et comment) cela fonctionne: Le fichier de préférences épingle tous les paquets de la distribution Ubuntu sur la priorité 50, ce qui les rend moins souhaitables que les paquets déjà installés. Les fichiers provenant du référentiel de sécurité ont la priorité par défaut (500), de sorte qu'ils sont pris en compte pour l'installation. Cela signifie que seuls les packages considérés comme plus souhaitables que ceux actuellement installés sont des mises à jour de sécurité. Plus d'informations sur l'épinglage dans la page de manuel apt_preferences .

Vous pouvez promouvoir temporairement une certaine distribution pour les mises à jour avec l' --target-releaseoption qui fonctionne avec apt-getet aptitude(au moins), ce qui vous permettra d'épingler certaines versions afin qu'elles soient éligibles pour la mise à niveau.

Si vous souhaitez utiliser ceci uniquement pour les scripts et ne pas le configurer par défaut pour le système, vous pouvez placer les règles dans un autre emplacement et utiliser ceci à la place:

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

Cela permettra à apt de rechercher le fichier de préférences à partir d’un emplacement autre que celui par défaut.

Le fichier de préférences donné à titre d'exemple ne s'applique pas aux référentiels tiers. Si vous souhaitez également les épingler, vous pouvez les utiliser apt-cache policypour déterminer facilement les clés requises pour l'épinglage.

Ressu
la source
Merci de prendre le temps pour une réponse complète. Je pense comprendre comment ça marche. Mais lorsque je crée le fichier / etc / apt / preferences et exécute apt-get upgrade, il souhaite mettre à niveau tous les packages, pas seulement les mises à jour de sécurité. Les mises à jour de liste avant et après sont exactement les mêmes, sauf avec / etc / apt / preferences, il ne souhaite pas mettre à niveau Leafpad, que j'ai construit à partir du source et installé "à la main" avec dpkg. C'est très étrange pour moi, mais cela peut signifier quelque chose pour vous.
Michael Crenshaw
1
Vous pouvez voir ce qui se passe avec la commande de stratégie apt-cache. Choisissez l'un des packages qui ne reçoivent pas de correctif de sécurité et exécutez-le apt-cache policy packagename. Cela listera les priorités pour différentes versions. Vous devriez voir différentes lignes et différentes priorités. S'il n'y a pas de lignes avec la priorité 50, l'épinglage n'affectera pas les paquets en question pour une raison quelconque.
Ressu
1
J'avais suivi cette réponse dans le passé. Aujourd'hui, j'ai découvert qu'en raison de cette réponse, 68 packages de mise à jour de sécurité n'étaient PAS installés sur mon serveur et ne se présentaient pas en tant que candidats à l'installation. Ce n'est pas une bonne réponse!
Ombre
12

Ce qui suit est confirmé dans Ubuntu 14.04 LTS.

Utilisez le unattended-upgradepaquet.

Regarde le fichier /etc/apt/apt.conf.d/50unattended-upgrades. Il devrait y avoir une section en haut qui est:

// 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";
};

Notez comment il a été configuré pour autoriser uniquement les mises à niveau sans surveillance pour les packages de sécurité, par défaut.

Modifier le fichier /etc/apt/apt.conf.d/10periodicsimilaire à:

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

Cela exécutera des mises à jour de sécurité automatiques sans surveillance, une fois par jour.

Maintenant, pour exécuter manuellement: sudo unattended-upgrade.

Pour tester une marche à sec, sans faire quoi que ce soit: sudo unattended-upgrade --dry-run.

Source: https://help.ubuntu.com/14.04/serverguide/automatic-updates.html

vcardillo
la source
Y a-t-il un moyen d'en faire un horaire mensuel?
mike.b93
1
@ mike.b93, je crois que le réglage APT::Periodic::Unattended-Upgrade "30";ferait cela - tous les 30 jours.
vcardillo
5

Bien que ce soit plutôt moche, vous pouvez désactiver tous les référentiels sauf le référentiel de sécurité, puis procédez comme suit:

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

Je ne l'ai pas testé, mais en théorie, il ne trouverait que les mises à jour dans le référentiel de sécurité et les appliquerait ...

Stephen RC
la source
Oui, c'est une possibilité. Je vais y regarder. Je ne suis pas bon chez BASH, mais je peux essayer de faire un script pour le faire.
Michael Crenshaw
D'accord, j'ai désactivé tout sauf les dépôts de sécurité Ubuntu et exécuté un sudo apt-get update && sudo apt-get upgrade(annulation avant toute mise à niveau). J'ai ensuite réactivé tous mes dépôts, exécuté sudo apt-get updateeet ouvert Update Manager. Les packages marqués comme mises à jour de sécurité ne correspondaient pas exactement à ce qui avait été apt-get upgradetrouvé, mais ils étaient très proches - assez proches pour moi. J'aimerais toujours savoir exactement comment Update Manager le fait et comment faire la même chose à partir de la ligne de commande, mais cela ira. Merci!
Michael Crenshaw
3
  • apt-get update: il suffit de lire les entrées dans le référentiel - selon la liste existante. Nécessaire pour vérifier ce qui est nouveau.
  • apt-get upgrade: toutes les mises à jour pour les paquets installés sans modules du noyau. Aucune mise à jour de version.
  • apt-get dist-upgrade: toutes les mises à jour pour les packages installés, y compris avec les modules du noyau. Aucune mise à jour de version.
  • apt-getavec paramètre -s: test seulement, aucun changement effectué.
fuser
la source
0

Sur Debians, j'utilise cette commande pour ne faire que des mises à jour de sécurité:

apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )
appuyez sur la touche
la source
0

Je ne trouve pas d'option dans apt-get ou aptitude, mais quelqu'un a posé la même question sur SuperUser. La seule réponse est:

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

Aucune réponse quant à savoir si cela a fonctionné cependant.

Ross
la source
2
Il semble que la méthode décrite dans cette page wiki dépende de la définition de l'argument --target-release d'aptitude sur <release> -security. Comme le PO de cette question, cette méthode installe toutes les mises à niveau, pas seulement les mises à niveau de sécurité. En lisant les pages de manuel apt-get et aptitude, je ne pense pas que l'argument --target-release vise même à limiter les mises à niveau à une simple sécurité, bien que je ne sois pas sûr de ce à quoi il sert .
Michael Crenshaw
0

Voici un script qui réalise cela de différentes manières:

#!/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
la source