Cette commande pour supprimer les anciens noyaux est-elle sûre à utiliser?

21

En parcourant Internet pour les articles Ubuntu, je suis tombé sur cette commande:

sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

L'auteur a dit qu'il s'agit d'une commande sur une seule ligne qui supprimera toutes les versions précédentes de Linux, ne laissant que la version actuelle !

En fait, je recherche une telle commande, mais je ne suis pas sûr de la sécurité de cette commande. J'aimerais savoir:

  • S'il est sûr d'exécuter cette commande?
  • Comment fonctionne cette commande? c'est-à-dire l'explication de petites parties d'une telle commande
  • Si cette commande sert un objectif différent, quelle serait la commande correcte pour réaliser ce que l'auteur prétend qu'elle fait?

Je deviens très confus et frustré lorsque j'essaie de déduire tout seul. Comment cela fonctionne de commande car il contient de nombreux /, |, \, *et des ^personnages qui sont difficiles à Google pour.

Je recherche une traduction et une explication étape par étape pour cette commande que je n'ai pas pu trouver sur Internet!

Bhavesh Diwan
la source
1
Cela ne semble pas être la même commande que vous citez, mais j'ai utilisé la commande dans tuxtweaks.com/2010/10/… pour supprimer les anciens noyaux sans aucun problème. Cette page explique également ce que fait la commande.
user68186
4
@UriHerrera apt-get autoremovene suggère aucun retrait de noyaux plus anciens pour moi. Si je ne les supprime pas, ils s'accumuleront jusqu'à ce que mon /bootespace soit insuffisant et que les mises à jour échouent. Avez-vous une référence à ce sujet à ce sujet?
gertvdijk
1
Il le fait pour moi, chaque fois qu'il y a une nouvelle mise à jour pour le noyau, il indique ensuite que les packages suivants, etc. ne sont plus nécessaires et il répertorie le noyau précédent que j'avais.
Uri Herrera
Ma réponse a été supprimée par un modérateur, donc je commente ici: Voir cet article pour l'explication du script. Je ne vois pas pourquoi une partie du script est s/^[^ ]* [^ ]* \([^ ]*\).*/\1/au lieu de simplement s/^[^ ]* \([^ ]*\).*/\1/. Le script n'est pas très robuste ni élégant. Par exemple, pourquoi vérifier le noyau actuel avant d'extraire le nom du package de la sortie? Quant à une alternative, sudo apt-get autoremove --purgepurge la plupart des noyaux anciens dans une dernière version d'Ubuntu comme Xubuntu 15.10.
jarno

Réponses:

27

Je dirais: ne l'utilisez pas sous la forme actuelle

  1. Il fait des changements sans vous le demander. La apt-get -y purgepartie permet au one-liner de commencer à exécuter des packages de purge, sans votre confirmation. Si une erreur dans le script existe, alors vous pourriez être foutu .

  2. Aucune source, aucun auteur donné. La source de celui-ci fait une différence ici. Dans le cas où il proviendrait d'un package système soigneusement testé, nous pouvons retracer les tests qui y sont effectués. D'une source aléatoire, nous ne pouvons pas lui faire confiance.

  3. dpkg -lfonctionne bien sans sudo. Je ne vois pas pourquoi l'auteur original pensait que c'était nécessaire.

Utiliser le bon sens

Retirez les parties nocives et omettez tout ce qui fonctionne en tant que root.

Par exemple, réduisez-le à ceci:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

qui ne produit que des éléments et s'exécute avec des autorisations utilisateur régulières . Une fois que vous acceptez que ces noyaux soient supprimés, vous pouvez vous ajouter | xargs sudo apt-get purge . C'est sans -yoption, intentionnellement, vous serez donc invité à confirmer les modifications sur le point d'être apportées à votre système.

Explication

  • dpkg -lAffiche la liste de tous les packages. Dans ce cas, il répertoriera uniquement les packages commençant par linux-comme nom.
  • |(un tuyau) dirige la sortie de la commande à gauche (nous appelons cela stdout) vers l'entrée de la commande à droite (nous appelons cela stdin).
  • sedest un outil pour manipuler des chaînes à l'aide d' expressions régulières . Dans ce cas, il manipule la sortie de la commande à gauche du tuyau et filtre les packages installés (en s'appuyant sur le iicomme indiqué par dpkg). Il est même imbriqué dans ce cas. Il serait trop difficile d'expliquer toute l'utilisation sedici, car son utilisation est très compliquée avec les expressions régulières complexes. (le \(.*\)-\([^0-9]\+\)"est un exemple d'expression régulière.
  • Les expressions régulières sont très largement utilisées pour trouver des correspondances basées sur l'expression qu'elles représentent. \1est la référence de remplacement pour effectuer une sorte de recherche-remplacement universelle (faisant référence au premier «hit» avec 1). L'expression régulière elle-même ne peut pas faire de mal. Cependant, s'ils manipulent l'entrée de manière incorrecte, ils peuvent vous faire supprimer les mauvais packages ou même faire une injection de shell. Dans ce cas, cela ressemble à un moyen de trouver le nom du paquetage du noyau en fonction de la version fournie par uname -r.
  • uname -r affiche la version actuelle du noyau en cours d'exécution.
  • xargsajoute les lignes de l'entrée gauche du tuyau comme arguments à la commande. Dans ce cas, les versions du noyau sur chaque ligne sont converties en une liste horizontale séparée par des espaces et ajoutées à la sudo apt-getcommande.
  • sudo apt-get -y purge [packagename] purge (supprime tout) les paquets donnés (en arguments).

Alternatives

De nombreuses questions sont probablement déjà posées à ce sujet. Ceux que j'ai trouvés jusqu'à présent:

gertvdijk
la source
1
quelle sera la rupture du nœud effrayant de cette commande qui est quelque chose comme ça /(.*)-(( ^^0-9 ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan
la commande ci-dessus dans cette réponse effacera-t-elle gracieusement les vieux noyaux ?? ou encore autoremove apt-get est mieux ??
Bhavesh Diwan
4
@ Z9iT Ce sont des expressions régulières. Ils sont utilisés pour trouver des correspondances en fonction de l' expression qu'ils représentent et \1c'est le contrôle de remplacement pour faire une sorte de recherche et de remplacement universel. Pour la suppression de tout colis, je me suis exprimé clairement dans ma réponse (étant mon avis): utilisez le bon sens. Ne laissez pas un script modifier automatiquement votre système. Vérifiez ce que cela ferait. Toujours.
gertvdijk
L'alternative que vous proposez ne purge pas les packages d'en-tête linux respectifs.
jarno
Ensuite, faites simplement une suppression automatique apt-get, qui devrait détecter que les en-têtes ne sont plus nécessaires.
ben-Nabiy Derush
7

Vous avez demandé une explication étape par étape, alors voici:

sudo dpkg -l 'linux-*'

Liste les packages commençant par linux-dans le nom du package

| sed

et diriger la liste vers sed

"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

qui utilisera une expression régulière très compliquée pour éditer la liste

| xargs

qui canalisera la nouvelle liste xargs, qui l'enverra comme argument à

sudo apt-get -y purge

qui purgera ces packages sans vous donner la possibilité de changer d'avis.

Ou peut-être est-il plus exact de dire qu'il enverra cette liste dans la commande de purge et en restera là. Que quelque chose soit purgé ou non - et surtout - exactement ce qui est purgé dépend de la sortie des commandes précédentes.

Est-ce sûr? Dans ce cas, tout dépend de la façon dont l'auteur de l'article où vous l'avez trouvé comprend les expressions régulières et la sedsyntaxe. Et il y a des livres entiers sur ces deux sujets.

chasses
la source
6

J'ai commencé par disséquer les commandes, en lisant la manpage de chacune.

  • dpkg -l: list pacakges, listerait donc dpkg -l linux-*tous les paquets commençant par linux-(généralement les noyaux).

  • sed: La sortie de dpkg -l linux-*est canalisée vers sedavec plusieurs expressions régulières qui seddécodent.

  • uname -r unameimprime les informations système

uname - imprimer les informations système

Le -rhandle imprime spécifiquement les versions du noyau:

-r, --kernel-release affiche la version du noyau

La sortie de uname -rest ensuite redirigée vers sedavec des expressions plus régulières, dont la sortie est passée àxargs

xargsTraduit donc la sedsortie en noms de packages et les transmet à sudo apt-get purge -yqui répond automatiquement «oui» à toutes les invites:

-y, --yes, --assume-yes Automatique oui aux invites; supposez «oui» comme réponse à toutes les invites et exécutez de manière non interactive. Si une situation indésirable, telle que la modification d'un package suspendu, la tentative d'installation d'un package non authentifié ou la suppression d'un package essentiel se produit, apt-get s'interrompra. Élément de configuration: APT :: Get :: Assume-Yes.

Au total, il semble que cette commande fera ce que vous voulez, mais pour être sûr que nous aurions à traduire sedles expressions régulières de.

Je viens de courir:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'  

voici une capture d'écran:

entrez la description de l'image ici

Toutes les anciennes versions du noyau iirc.

Seth
la source
quel est l'entraînement pour traduire l'expression de ce sed?
Bhavesh Diwan
2
J'essaie de comprendre en ce moment, cela pourrait prendre un certain temps;)
Seth
Voir ma réponse .
jarno
@ Z9iT J'étais trop paresseux pour copier l'explication du script de l'article lié à la réponse, donc je suppose que c'est pourquoi Seth a supprimé ma réponse. Mais je pense que l'article lié est ce que vous cherchiez sur Internet. Je vous ai également dit un moyen plus sûr de supprimer les anciens noyaux, bien qu'il conserve 2-3 noyaux juste au cas où, et peut ne pas fonctionner dans toutes les versions actuelles d'Ubuntu.
jarno
@jarno Je l'ai supprimé parce que Z9iT demandait une commande spécifique , pas un moyen sûr de supprimer les anciens noyaux. Cela pourrait toujours être pertinent, mais dans un commentaire, pas une réponse :) (comme vous l'avez fait)
Seth