web-dev-qa-db-fra.com

Cette commande permettant de supprimer les anciens noyaux est-elle sûre?

En parcourant Internet pour trouver des articles sur 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 déclaré qu'il s'agissait d'une commande d'une seule ligne qui supprimera toutes les versions précédentes de Linux, ne laissant que la version actuelle!

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

  • Que ce soit sûr d'exécuter cette commande?
  • Comment fonctionne cette commande? c'est-à-dire l'explication de petites parties d'une si grosse commande
  • Si cette commande sert à quelque chose de différent, alors quelle serait la bonne commande pour obtenir ce que l'auteur prétend la faire?

Je deviens très confus et frustré lorsque j'essaie de déduire par moi-même. En quoi cette commande fonctionne-t-elle? Elle contient de nombreux caractères /, |, \, * et ^ qui sont difficiles à utiliser pour Google.

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

21
Bhavesh Diwan

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

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

  2. Aucune source, aucun auteur donné. La source en fait une différence ici. Dans le cas où cela proviendrait d'un package système soigneusement testé, nous pourrons y retrouver les tests effectués. D'une source aléatoire, nous ne pouvons pas lui faire confiance.

  3. dpkg -l fonctionne correctement sans Sudo. Je ne vois pas pourquoi l'auteur original a pensé que c'était nécessaire.

Utiliser le bon sens

Supprimez les parties nuisibles et laissez de côté 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 fait que uniquement des sorties et s'exécute avec des autorisations utilisateur normales . Une fois que vous acceptez de supprimer ces noyaux, vous pouvez ajouter | xargs Sudo apt-get purge vous-même. C'est sans l'option -y intentionnellement, il vous sera donc demandé de confirmer les modifications sur le point d'être apportées à votre système.

Explication

  • dpkg -l Affiche la liste de tous les packages. Dans ce cas, seuls les paquets commençant par portant le nom linux- seront listés.
  • | (un tuyau) dirige la sortie de la commande de gauche (nous appelons cela stdout) vers l'entrée de la commande de droite (nous appelons cela stdin).
  • sed est un outil permettant de manipuler des chaînes à l'aide d'expressions régulières . Dans ce cas, il manipule la sortie de la commande située à gauche du tube et filtre les paquetages installés (en utilisant le paramètre ii donné par dpkg). Il est même imbriqué dans ce cas. Il serait trop difficile d'expliquer l'utilisation de sed dans son ensemble, car son utilisation est très compliquée avec les expressions régulières complexes. (\(.*\)-\([^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 en fonction de l'expression qu'elles représentent. \1 est la référence de remplacement permettant d'effectuer une sorte de recherche/remplacement universel (faisant référence au premier "hit" avec 1). L'expression régulière elle-même ne peut pas nuire. Toutefois, s’ils manipulent l’entrée de manière erronée, ils peuvent vous demander de supprimer les mauvais packages ou même d’injecter Shell. Dans ce cas, cela ressemble à un moyen de trouver le nom du paquet du noyau basé sur la version fournie par uname -r.
  • uname -r affiche la version actuelle du noyau en cours d'exécution.
  • xargs ajoute les lignes de l'entrée à gauche du tube en tant qu'arguments de la commande. Dans ce cas, les versions du noyau de chaque ligne sont converties en une liste horizontale séparée par des espaces et ajoutées à la commande Sudo apt-get.
  • Sudo apt-get -y purge [packagename] purge (supprime tout) les packages donnés (en tant qu'arguments).

Des alternatives

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

27
gertvdijk

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

Sudo dpkg -l 'linux-*'

Liste les paquets commençant par linux- dans le nom du paquet

| sed

et canaliser la liste dans sedname__

"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 dirigera la nouvelle liste dans xargsname__, qui l'enverra en tant qu'argument à

Sudo apt-get -y purge

ce qui va purger ces paquets sans vous donner une chance 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 ou non purgé - 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 manière dont l'auteur du message où vous l'avez trouvé comprend les expressions régulières et la syntaxe sedname__. Et il existe des livres entiers sur ces deux sujets.

7
chaskes

J'ai commencé par disséquer les commandes, en lisant la page man pour chacune.

  • dpkg -l: list les paquets, donc dpkg -l linux-* listera tous les paquets qui ont commencé avec linux- (généralement des noyaux).

  • sed: La sortie de dpkg -l linux-* est reliée à sed avec plusieurs expressions régulières que sed décode.

  • uname -runameprints informations système

uname - affiche les informations du système

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

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

La sortie de uname -r est ensuite redirigée vers sed avec plus d'expressions régulières, dont la sortie est passée à xargs

Donc, xargs traduit la sortie sed en noms de paquet et les transmet à Sudo apt-get purge -y qui répond automatiquement par "oui" à toutes les invites:

-y, --oui, --assume-yes Automatique oui à l'invite; supposez "oui" comme réponse à toutes les invites et exécutez-le de manière non interactive. Si une situation indésirable, telle que la modification d'un paquet en attente, l'installation d'un paquet non authentifié ou la suppression d'un paquet essentiel, se produit, apt-get sera abandonné. Élément de configuration: APT :: Get :: Assume-Yes.

Globalement, il semble que cette commande va fasse ce que vous voulez, bien que pour savoir avec certitude nous devions traduire les expressions régulières de sed.

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:

enter image description here

Toutes les anciennes versions du noyau iirc.

6
Seth