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!
package-management
security
command-line
Bhavesh Diwan
quelle
quelle
apt-get autoremove
schlägt für mich keine Entfernung älterer Kernel vor. Wenn ich sie nicht lösche, stapeln sie sich nur, bis mein/boot
Speicherplatz erschöpft ist und Aktualisierungen fehlschlagen. Haben Sie eine Referenz dafür, dass es das tun soll?s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
statt einfach ists/^[^ ]* \([^ ]*\).*/\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 diesudo apt-get autoremove --purge
meisten alten Kernel in einer der neuesten Versionen von Ubuntu wie Xubuntu 15.10 gelöscht werden.Antworten:
Ich würde sagen: Verwenden Sie es nicht in der aktuellen Form
Es nimmt Änderungen vor, ohne Sie zu fragen. Mit diesem
apt-get -y purge
Teil 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 .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.
dpkg -l
läuft gut ohnesudo
. 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:
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-y
Option ist absichtlich nicht verfügbar. Sie werden daher aufgefordert, die an Ihrem System vorgenommenen Änderungen zu bestätigen.Erläuterung
dpkg -l
Gibt die Liste aller Pakete aus. In diesem Fall werden nur Pakete aufgelistet aufgelistet, die mitlinux-
dem Namen beginnen.|
(eine Pipe) leitet die Ausgabe des Befehls auf der linken Seite (wir nennen dasstdout
) zur Eingabe des Befehls auf der rechten Seite (wir nennen dasstdin
).sed
ist 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 demii
vondpkg
). In diesem Fall wird es sogar verschachtelt. Es wäre zu schwierig, den gesamten Gebrauchsed
hier 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.\1
ist 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 ermitteltuname -r
.uname -r
gibt die aktuelle Version des laufenden Kernels aus.xargs
Hä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 densudo apt-get
Befehl 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:
Aus dieser Antwort geht hervor , dass der folgende Befehl auf viel sicherere und häufigere Weise dasselbe bewirkt:
quelle
\1
ist 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.Sie haben nach einer schrittweisen Erklärung gefragt. Gehen Sie dazu wie folgt vor:
Listet Pakete auf, die mit
linux-
dem Paketnamen beginnenund leiten Sie die Liste in
sed
Hierfür wird ein sehr komplizierter regulärer Ausdruck verwendet, um die Liste zu bearbeiten
Das leitet die neue Liste weiter
xargs
und sendet sie als Argument anDadurch 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
sed
Syntax versteht. Und zu beiden Themen gibt es ganze Bücher.quelle
Ich begann damit, die Befehle zu zerlegen und jeweils die
man
Seite zu lesen .dpkg -l
: liste pacakges auf,dpkg -l linux-*
liste also alle Pakete auf, mit denen begonnen wurdelinux-
(normalerweise Kernel).sed
: Die Ausgabe vondpkg -l linux-*
wirdsed
mit mehreren regulären Ausdrücken weitergeleitet, diesed
decodieren.uname -r
uname
druckt SysteminformationenDas
-r
Handle druckt speziell Kernel-Releases:Die Ausgabe von
uname -r
wird dannsed
mit reguläreren Ausdrücken weitergeleitet, an die die Ausgabe übergeben wirdxargs
Wandelt
xargs
diesed
Ausgabe in Paketnamen um und leitet sie weiter, aufsudo apt-get purge -y
die alle Eingabeaufforderungen automatisch mit "Ja" beantwortet werden:Insgesamt scheint dieser Befehl das zu tun, was Sie wollen, obwohl Sie sicher sein müssen, dass wir übersetzen müssen
sed
regulären Ausdrücke übersetzen müssen.Ich bin gerade gelaufen:
Hier ist ein Screenshot:
Alle alten Kernelversionen iirc.
quelle