Ist dieser Befehl zum Entfernen alter Kernel sicher zu verwenden?

21

Beim Surfen im Internet nach Ubuntu-Artikeln bin ich auf folgenden Befehl gestoßen:

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

Der Autor sagte, dass dies ein einzeiliger Befehl ist, der alle vorherigen Linux-Versionen löscht und nur die aktuelle Version zurücklässt !

Ich suche tatsächlich nach einem solchen Befehl, bin mir aber nicht so sicher, wie sicher das ist. Ich würde gerne wissen:

  • Ob es sicher ist, diesen Befehl auszuführen?
  • Wie funktioniert dieser Befehl? dh Erklärung kleiner Teile eines so großen Befehls
  • Wenn dieser Befehl einem anderen Zweck dient, was wäre dann der richtige Befehl, um das zu erreichen, was der Autor behauptet?

Ich werde sehr verwirrt und frustriert, wenn ich versuche, alles alleine herauszufinden. Wie funktioniert dieser Befehl Arbeit für sie zahlreiche enthält /, |, \, *, und ^Zeichen , die für Google hart sind.

Ich suche eine schrittweise Übersetzung und Erklärung für diesen Befehl, die ich im Internet nicht finden konnte!

Bhavesh Diwan
quelle
1
Dies scheint nicht derselbe Befehl zu sein, den Sie zitieren, aber ich habe den Befehl in tuxtweaks.com/2010/10/… verwendet , um alte Kernel ohne Probleme zu entfernen. Auf dieser Seite wird auch die Funktionsweise des Befehls erläutert.
user68186
4
@UriHerrera apt-get autoremoveschlägt für mich keine Entfernung älterer Kernel vor. Wenn ich sie nicht lösche, stapeln sie sich nur, bis mein /bootSpeicherplatz erschöpft ist und Aktualisierungen fehlschlagen. Haben Sie eine Referenz dafür, dass es das tun soll?
Gertvdijk
1
Wenn es ein neues Update für den Kernel gibt, heißt es, dass die folgenden Pakete usw. nicht mehr benötigt werden und der vorherige Kernel aufgeführt wird, den ich hatte.
Uri Herrera
Meine Antwort wurde von einem Moderator gelöscht, daher kommentiere ich hier: Erläuterungen zum Skript finden Sie in diesem Artikel . Ich verstehe nicht, warum ein Teil des Skripts s/^[^ ]* [^ ]* \([^ ]*\).*/\1/statt einfach ist s/^[^ ]* \([^ ]*\).*/\1/. Das Skript ist nicht sehr robust oder elegant. Warum zum Beispiel nach dem aktuellen Kernel suchen, bevor der Paketname aus der Ausgabe extrahiert wird? Als Alternative können die sudo apt-get autoremove --purgemeisten alten Kernel in einer der neuesten Versionen von Ubuntu wie Xubuntu 15.10 gelöscht werden.
jarno

Antworten:

27

Ich würde sagen: Verwenden Sie es nicht in der aktuellen Form

  1. Es nimmt Änderungen vor, ohne Sie zu fragen. Mit diesem apt-get -y purgeTeil kann der Einzeiler ohne Ihre Bestätigung mit der Ausführung von Löschpaketen beginnen. Wenn ein Fehler im Skript vorliegt, könnten Sie geschraubt werden .

  2. Keine Quelle, kein Autor angegeben. Die Quelle macht hier einen Unterschied. Falls es sich um ein gründlich getestetes Systempaket handelt, können wir die durchgeführten Tests darauf zurückverfolgen. Aus einer zufälligen Quelle können wir ihm nicht vertrauen.

  3. dpkg -lläuft gut ohne sudo. Ich verstehe nicht, warum der ursprüngliche Autor dies für notwendig hielt.

Verwenden Sie gesunden Menschenverstand

Entfernen Sie die schädlichen Teile und lassen Sie alles weg, was als Root ausgeführt wird.

Schneiden Sie es zum Beispiel so ab:

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

das gibt einfach nur zeug aus und läuft mit normalen Benutzerberechtigungen . Sobald Sie damit einverstanden sind, dass diese Kernel entfernt werden, können Sie sich selbst anhängen | xargs sudo apt-get purge . Diese -yOption ist absichtlich nicht verfügbar. Sie werden daher aufgefordert, die an Ihrem System vorgenommenen Änderungen zu bestätigen.

Erläuterung

  • dpkg -lGibt die Liste aller Pakete aus. In diesem Fall werden nur Pakete aufgelistet aufgelistet, die mit linux-dem Namen beginnen.
  • |(eine Pipe) leitet die Ausgabe des Befehls auf der linken Seite (wir nennen das stdout) zur Eingabe des Befehls auf der rechten Seite (wir nennen das stdin).
  • sedist ein Werkzeug zum Manipulieren von Strings mit regulären Ausdrücken . In diesem Fall manipuliert es die Ausgabe des Befehls auf der linken Seite der Pipe und filtert nach installierten Paketen (abhängig von dem iivondpkg ). In diesem Fall wird es sogar verschachtelt. Es wäre zu schwierig, den gesamten Gebrauch sedhier zu erklären , da sein Gebrauch mit den komplexen regulären Ausdrücken sehr kompliziert ist. (Das \(.*\)-\([^0-9]\+\)"ist ein Beispiel für einen regulären Ausdruck.
  • Reguläre Ausdrücke werden sehr häufig verwendet, um Übereinstimmungen anhand des Ausdrucks zu finden, den sie darstellen. \1ist die Ersatzreferenz für eine Art universelles Suchen und Ersetzen (Bezug auf den ersten "Treffer" mit1 ). Der reguläre Ausdruck selbst kann keinen Schaden anrichten. Wenn sie jedoch die Eingabe falsch manipulieren, können Sie die falschen Pakete entfernen oder sogar Shell-Injection durchführen. In diesem Fall sieht es so aus, als würde der Name des Kernelpakets anhand der von bereitgestellten Version ermittelt uname -r.
  • uname -r gibt die aktuelle Version des laufenden Kernels aus.
  • xargsHängt die Zeilen der Eingabe links von der Pipe als Argumente an den Befehl an. In diesem Fall werden die Kernelversionen in jeder Zeile in eine durch horizontale Leerzeichen getrennte Liste konvertiert und an den sudo apt-getBefehl angehängt .
  • sudo apt-get -y purge [packagename] löscht (entfernt alles) der angegebenen Pakete (als Argumente).

Alternativen

Einige Fragen werden wahrscheinlich schon dazu gestellt. Relevante, die ich bisher gefunden habe:

gertvdijk
quelle
1
Was soll die Trennung des beängstigend aussehenden Knotens dieses Befehls sein, der ungefähr so ​​aussieht? ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan
Wird der obige Befehl in dieser Antwort alte Kernel anmutig löschen? oder noch apt-get autoremove ist besser?
Bhavesh Diwan
4
@ Z9iT Das sind reguläre Ausdrücke. Sie werden verwendet, um Übereinstimmungen auf der Grundlage des Ausdrucks zu finden, den sie darstellen, und das \1ist die Ersetzungssteuerung, um eine Art universelles Suchen und Ersetzen durchzuführen. Zum Entfernen eines Pakets habe ich mich in meiner Antwort (meiner Meinung nach) klar ausgedrückt: Nutze den gesunden Menschenverstand. Lassen Sie ein Skript nicht automatisch Änderungen an Ihrem System vornehmen. Überprüfen Sie, was es tun würde. Immer.
Gertvdijk
Die Alternative, die Sie verwenden, löscht die entsprechenden Linux-Header-Pakete nicht.
jarno
Dann führen Sie einfach eine automatische Entfernung durch, mit der festgestellt werden soll, dass diese Header nicht mehr benötigt werden.
Ben-Nabiy Derush
7

Sie haben nach einer schrittweisen Erklärung gefragt. Gehen Sie dazu wie folgt vor:

sudo dpkg -l 'linux-*'

Listet Pakete auf, die mit linux-dem Paketnamen beginnen

| sed

und leiten Sie die Liste in sed

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

Hierfür wird ein sehr komplizierter regulärer Ausdruck verwendet, um die Liste zu bearbeiten

| xargs

Das leitet die neue Liste weiter xargsund sendet sie als Argument an

sudo apt-get -y purge

Dadurch werden diese Pakete gelöscht, ohne dass Sie die Möglichkeit haben, Ihre Meinung zu ändern.

Oder vielleicht ist es genauer zu sagen, dass diese Liste in den Löschbefehl gesendet und dabei belassen wird. Ob etwas gelöscht wird oder nicht - und vor allem - genau das , was gelöscht wird gelöscht hängt von der Ausgabe der vorherigen Befehle ab.

Ist es sicher? In diesem Fall hängt alles davon ab, wie gut der Autor des Posts, bei dem Sie ihn gefunden haben, reguläre Ausdrücke und die sedSyntax versteht. Und zu beiden Themen gibt es ganze Bücher.

chaskes
quelle
6

Ich begann damit, die Befehle zu zerlegen und jeweils die manSeite zu lesen .

  • dpkg -l: liste pacakges auf, dpkg -l linux-*liste also alle Pakete auf, mit denen begonnen wurde linux-(normalerweise Kernel).

  • sed: Die Ausgabe von dpkg -l linux-*wird sedmit mehreren regulären Ausdrücken weitergeleitet, die seddecodieren.

  • uname -r unamedruckt Systeminformationen

uname - Systeminformationen drucken

Das -rHandle druckt speziell Kernel-Releases:

-r, --kernel-release Gibt das Kernel-Release aus

Die Ausgabe von uname -rwird dann sedmit reguläreren Ausdrücken weitergeleitet, an die die Ausgabe übergeben wirdxargs

Wandelt xargsdie sedAusgabe in Paketnamen um und leitet sie weiter, auf sudo apt-get purge -ydie alle Eingabeaufforderungen automatisch mit "Ja" beantwortet werden:

-y, --yes, --assume-yes Automatisch Ja zu Eingabeaufforderungen; Nehmen Sie "Ja" als Antwort auf alle Eingabeaufforderungen an und führen Sie es nicht interaktiv aus. Wenn eine unerwünschte Situation eintritt, z. B. das Ändern eines angehaltenen Pakets, der Versuch, ein nicht authentifiziertes Paket zu installieren oder ein wesentliches Paket zu entfernen, wird apt-get abgebrochen. Konfigurationselement: APT :: Get :: Assume-Yes.

Insgesamt scheint dieser Befehl das zu tun, was Sie wollen, obwohl Sie sicher sein müssen, dass wir übersetzen müssensed regulären Ausdrücke übersetzen müssen.

Ich bin gerade gelaufen:

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

Hier ist ein Screenshot:

Bildbeschreibung hier eingeben

Alle alten Kernelversionen iirc.

Seth
quelle
Was ist das Training, um den Ausdruck dieses Sed zu übersetzen?
Bhavesh Diwan
2
Ich versuche es jetzt zu verstehen, es könnte eine Weile dauern;)
Seth
Siehe meine Antwort .
jarno
@ Z9iT Ich war zu faul, um die Erklärung des Skripts aus dem verlinkten Artikel in die Antwort zu kopieren. Deshalb hat Seth wohl meine Antwort gelöscht. Aber ich denke, der verlinkte Artikel ist genau das, wonach Sie im Internet gesucht haben. Ich habe Ihnen auch einen sichereren Weg erklärt, alte Kernel zu entfernen, obwohl 2-3 Kernel für alle Fälle erhalten bleiben und möglicherweise noch nicht in allen aktuellen Ubuntu-Versionen funktionieren.
jarno
@jarno Ich habe es gelöscht, weil Z9iT nach a gefragt hat bestimmten Befehl , nicht nach einer sicheren Möglichkeit, alte Kernel zu entfernen. Das könnte immer noch relevant sein, aber in einem Kommentar, keine Antwort :) (wie Sie)
Seth