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!
package-management
security
command-line
Bhavesh Diwan
la source
la source
apt-get autoremove
ne suggère aucun retrait de noyaux plus anciens pour moi. Si je ne les supprime pas, ils s'accumuleront jusqu'à ce que mon/boot
espace soit insuffisant et que les mises à jour échouent. Avez-vous une référence à ce sujet à ce sujet?s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
au lieu de simplements/^[^ ]* \([^ ]*\).*/\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 --purge
purge la plupart des noyaux anciens dans une dernière version d'Ubuntu comme Xubuntu 15.10.Réponses:
Je dirais: ne l'utilisez pas sous la forme actuelle
Il fait des changements sans vous le demander. La
apt-get -y purge
partie 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 .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.
dpkg -l
fonctionne bien sanssudo
. 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:
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-y
option, intentionnellement, vous serez donc invité à 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, il répertoriera uniquement les packages commençant parlinux-
comme nom.|
(un tuyau) dirige la sortie de la commande à gauche (nous appelons celastdout
) vers l'entrée de la commande à droite (nous appelons celastdin
).sed
est 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 leii
comme indiqué pardpkg
). Il est même imbriqué dans ce cas. Il serait trop difficile d'expliquer toute l'utilisationsed
ici, 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.\1
est la référence de remplacement pour effectuer une sorte de recherche-remplacement universelle (faisant référence au premier «hit» avec1
). 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 paruname -r
.uname -r
affiche la version actuelle du noyau en cours d'exécution.xargs
ajoute 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 à lasudo apt-get
commande.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:
D'après cette réponse , la commande suivante semble faire la même chose de manière beaucoup plus sûre et plus courante:
la source
\1
c'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.Vous avez demandé une explication étape par étape, alors voici:
Liste les packages commençant par
linux-
dans le nom du packageet diriger la liste vers
sed
qui utilisera une expression régulière très compliquée pour éditer la liste
qui canalisera la nouvelle liste
xargs
, qui l'enverra comme argument à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
sed
syntaxe. Et il y a des livres entiers sur ces deux sujets.la source
J'ai commencé par disséquer les commandes, en lisant la
man
page de chacune.dpkg -l
: list pacakges, listerait doncdpkg -l linux-*
tous les paquets commençant parlinux-
(généralement les noyaux).sed
: La sortie dedpkg -l linux-*
est canalisée verssed
avec plusieurs expressions régulières quised
décodent.uname -r
uname
imprime les informations systèmeLe
-r
handle imprime spécifiquement les versions du noyau:La sortie de
uname -r
est ensuite redirigée verssed
avec des expressions plus régulières, dont la sortie est passée àxargs
xargs
Traduit donc lased
sortie en noms de packages et les transmet àsudo apt-get purge -y
qui répond automatiquement «oui» à toutes les invites:Au total, il semble que cette commande fera ce que vous voulez, mais pour être sûr que nous aurions à traduire
sed
les expressions régulières de.Je viens de courir:
voici une capture d'écran:
Toutes les anciennes versions du noyau iirc.
la source