Questo comando per rimuovere i vecchi kernel è sicuro da usare?


21

Durante la navigazione in Internet per gli articoli di Ubuntu, mi sono imbattuto in questo comando:

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'autore ha detto che si tratta di un comando a riga singola che eliminerà tutte le versioni precedenti di Linux, lasciando solo quella corrente !

In realtà sto cercando un tale comando, ma non sono così sicuro di quanto sia sicuro. Mi piacerebbe sapere

  • Se è sicuro eseguire questo comando?
  • Come funziona questo comando? cioè spiegazione di piccole parti di un comando così grande
  • Se questo comando ha uno scopo diverso, quale sarebbe il comando corretto per ottenere ciò che l'autore afferma di fare?

Divento molto confuso e frustrato quando provo a dedurre tutto da solo. Come funziona questo comando perché contiene numerose /, |, \, *, e ^personaggi che sono difficili da Google per.

Sto cercando una traduzione passo passo e una spiegazione per questo comando che non sono riuscito a trovare su Internet!


1
Questo non sembra essere lo stesso comando che citi, ma ho usato il comando in tuxtweaks.com/2010/10/… per rimuovere i vecchi kernel senza problemi. Questa pagina spiega anche cosa fa il comando.
user68186

4
@UriHerrera apt-get autoremovenon mi suggerisce alcuna rimozione di kernel più vecchi. Se non li elimino, si accumuleranno fino a quando il mio /bootspazio è esaurito e gli aggiornamenti falliscono. Hai un riferimento per questo che dovrebbe farlo?
gertvdijk,

1
Lo fa per me, ogni volta che c'è un nuovo aggiornamento per il kernel, dice che i seguenti pacchetti ecc. Non sono più necessari ed elenca il kernel precedente che avevo.
Uri Herrera,

La mia risposta è stata cancellata da un moderatore, quindi commento qui: vedi questo articolo per la spiegazione dello script. Non vedo perché una parte della sceneggiatura sia s/^[^ ]* [^ ]* \([^ ]*\).*/\1/invece semplicemente s/^[^ ]* \([^ ]*\).*/\1/. La sceneggiatura non è molto robusta o elegante. Ad esempio, perché controllare il kernel corrente prima di estrarre il nome del pacchetto dall'output? Per quanto riguarda un'alternativa, sudo apt-get autoremove --purgeelimina i kernel più vecchi in alcune ultime versioni di Ubuntu come Xubuntu 15.10.
jarno,

Risposte:


27

Direi: non usarlo nella forma attuale

  1. Apporta modifiche senza chiedertelo. La apt-get -y purgeparte consente al one-liner di iniziare l'esecuzione dei pacchetti di spurgo, senza la tua conferma. Se esiste qualche errore nello script, allora potresti essere fregato .

  2. Nessuna fonte, nessun autore dato. La sua fonte fa la differenza qui. Nel caso in cui provenga da un pacchetto di sistema accuratamente testato, possiamo tracciare il test che viene eseguito su di esso. Da una fonte casuale, non possiamo fidarci.

  3. dpkg -lfunziona bene senza sudo. Non vedo perché l'autore originale pensasse che fosse necessario.

Usa il senso comune

Rimuovi le parti dannose e lascia fuori tutto ciò che funziona come root.

Ad esempio, riduci a questo:

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

che produce solo roba e funziona con permessi utente regolari . Una volta che sei d'accordo con questi kernel da rimuovere, puoi aggiungerti | xargs sudo apt-get purge . È senza l' -yopzione, intenzionalmente, quindi ti verrà chiesto di confermare le modifiche che stanno per essere apportate al tuo sistema.

Spiegazione

  • dpkg -lEmette l'elenco di tutti i pacchetti. In questo caso elencherà solo i pacchetti che iniziano con linux-il nome.
  • |(una pipe) convoglia l'output del comando a sinistra (lo chiamiamo così stdout) nell'input del comando a destra (lo chiamiamo stdin).
  • sedè uno strumento per manipolare le stringhe usando espressioni regolari . In questo caso manipola l'output del comando a sinistra della pipe e filtra i pacchetti installati (basandosi su iicome indicato da dpkg). In questo caso viene persino annidato. Sarebbe troppo difficile spiegare l'intero uso di sedqui, poiché il suo uso è molto complicato con le espressioni regolari complesse. (il \(.*\)-\([^0-9]\+\)"è un esempio di espressione regolare.
  • Le espressioni regolari sono ampiamente utilizzate per trovare corrispondenze in base all'espressione che rappresentano. \1è il riferimento di sostituzione per eseguire una sorta di ricerca e sostituzione universale (facendo riferimento al primo "hit" con 1). L'espressione regolare non può fare alcun male. Tuttavia, se manipolano l'input in modo errato, possono farti rimuovere i pacchetti sbagliati o persino fare l'iniezione della shell. In questo caso sembra un modo per trovare il nome del pacchetto kernel in base alla versione fornita da uname -r.
  • uname -r genera la versione corrente del kernel in esecuzione.
  • xargsaccoda le righe dell'input a sinistra della pipe come argomenti al comando. In questo caso, le versioni del kernel su ciascuna riga vengono convertite in un elenco separato da spazi orizzontali e aggiunte al sudo apt-getcomando.
  • sudo apt-get -y purge [packagename] elimina (rimuove tutto) i pacchetti forniti (come argomenti).

alternative

Probabilmente sono già state poste alcune domande al riguardo. Quelle pertinenti che ho trovato finora:


1
quale sarà la rottura del nodo dall'aspetto spaventoso di questo comando che è qualcosa del genere /(.*)-([^0-9[\+)/\1/")"'/d;s/^[^ ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan,

il suddetto comando in questa risposta cancellerà con grazia vecchi kernel? o ancora apt-get autoremove è meglio ??
Bhavesh Diwan,

4
@ Z9iT Quelle sono espressioni regolari. Sono utilizzati per trovare corrispondenze in base all'espressione che rappresentano e il \1controllo di sostituzione è una sorta di ricerca e sostituzione universale. Per la rimozione di qualsiasi pacchetto mi sono espresso chiaramente nella mia risposta (essendo la mia opinione): usare il buon senso. Non lasciare che uno script modifichi automaticamente il tuo sistema. Verifica cosa farebbe. Sempre.
gertvdijk,

L'alternativa che proponi non elimina i rispettivi pacchetti di header linux.
jarno,

Quindi esegui un apt-get autoremove, che dovrebbe rilevare che quelle intestazioni non sono più necessarie.
ben-Nabiy Derush,

7

Hai chiesto una spiegazione dettagliata quindi ecco:

sudo dpkg -l 'linux-*'

Elenca i pacchetti che iniziano con linux-il nome del pacchetto

| sed

e reindirizza l'elenco in sed

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

che utilizzerà un'espressione regolare molto complicata per modificare l'elenco

| xargs

in cui verrà reindirizzato il nuovo elenco xargs, che verrà inviato come argomento a

sudo apt-get -y purge

che eliminerà quei pacchetti senza darti la possibilità di cambiare idea.

O forse è più preciso dire che invierà quell'elenco nel comando di eliminazione e lo lascerà a quello. La cancellazione o meno di qualsiasi cosa - e soprattutto - esattamente ciò che viene eliminato dipende dall'uscita dei comandi precedenti.

È sicuro? In questo caso tutto dipende da quanto bene l'autore del post in cui l'hai trovato capisce le espressioni e la sedsintassi regolari . E ci sono libri interi su entrambi questi argomenti.


6

Ho iniziato dissezionando i comandi, leggendo la manpagina per ciascuno.

  • dpkg -l: elenca i pacakges, quindi dpkg -l linux-*elencherebbe tutti i pacchetti che sono iniziati con linux-(solitamente kernel).

  • sed: L'output di dpkg -l linux-*viene reindirizzato sedcon diverse espressioni regolari che seddecodificano.

  • uname -r unamestampa le informazioni di sistema

uname: stampa le informazioni di sistema

L' -rhandle stampa specificamente le versioni del kernel:

-r, --kernel-release stampa la versione del kernel

L'output di uname -rviene quindi reindirizzato a sedcon espressioni più regolari, il cui output viene passato axargs

Quindi xargstraduce l' sedoutput in nomi di pacchetto e li passa su sudo apt-get purge -ycui risponde automaticamente "sì" a tutti i prompt:

-y, --yes, --assume-yes Automatico sì ai prompt; assumere "sì" come risposta a tutte le istruzioni ed eseguire in modo non interattivo. Se si verifica una situazione indesiderata, come la modifica di un pacchetto trattenuto, il tentativo di installare un pacchetto non autenticato o la rimozione di un pacchetto essenziale, apt-get si interromperà. Voce di configurazione: APT :: Get :: Assume-Yes.

Nel complesso sembra che questo comando farà quello che vuoi, anche se per sapere con certezza dovremmo tradurre sedle espressioni regolari.

Ho appena corso:

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

ecco uno screenshot:

inserisci qui la descrizione dell'immagine

Tutte le vecchie versioni del kernel iirc.


qual è l'allenamento per tradurre l'espressione di questa sed?
Bhavesh Diwan,

2
Sto cercando di capirlo in questo momento, potrebbe volerci un po 'di tempo;)
Seth


@ Z9iT Ero troppo pigro per copiare la spiegazione dello script dall'articolo collegato alla risposta, quindi immagino sia per questo che Seth abbia cancellato la mia risposta. Ma penso che l'articolo collegato sia quello che stavi cercando da Internet. Ti ho anche detto un modo più sicuro per rimuovere i vecchi kernel, anche se mantiene 2-3 kernel per ogni evenienza e potrebbe non funzionare ancora in tutte le versioni correnti di Ubuntu.
jarno,

@jarno L'ho eliminato perché Z9iT stava chiedendo un comando specifico , non un modo sicuro per rimuovere i vecchi kernel. Potrebbe essere ancora pertinente, ma in un commento, non una risposta :) (come hai fatto tu)
Seth
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.