Questo comando consente di rimuovere i vecchi kernel sicuri da usare?

21

Durante la navigazione in internet per articoli di Ubuntu, ho trovato questo comando:

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

L'autore ha detto che si tratta di un comando a riga singola che cancellerà tutte le versioni precedenti di Linux, lasciando solo quella corrente !

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

  • Se è sicuro eseguire questo comando?
  • Come funziona questo comando? cioè la 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 contiene numerosi / , | , \ , * e ^ caratteri difficili da Google per.

Sto cercando una traduzione passo dopo passo & amp; spiegazione per questo comando che non sono riuscito a trovare su Internet!

    
posta Z9iT 18.01.2013 - 19:20
fonte

3 risposte

27

Direi: non usarlo nella forma attuale

  1. Apporta le modifiche senza chiederti. La parte apt-get -y purge consente a one-liner di avviare l'esecuzione dei pacchetti di eliminazione, senza la tua conferma. Se esiste qualche errore nello script, potresti essere avvitato .

  2. Nessuna fonte, nessun autore dato. La fonte di ciò fa la differenza qui. Nel caso in cui provenga da un pacchetto di sistema accuratamente testato, possiamo tracciare i test effettuati su di esso. Da una fonte casuale, non possiamo fidarci di esso.

  3. dpkg -l funziona bene senza sudo . Non vedo perché l'autore originale abbia pensato che fosse necessario.

Usa il buon senso

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

Ad esempio, ridurlo a questo:

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

che emette solo elementi e esegue con permessi utente regolari . Una volta che sei d'accordo con questi kernel da rimuovere, puoi aggiungere | xargs sudo apt-get purge te stesso. È senza l'opzione -y , intenzionalmente, quindi ti verrà chiesta conferma sulle modifiche che devono essere apportate al tuo sistema.

Spiegazione

  • dpkg -l Emette l'elenco di tutti i pacchetti. In questo caso elenca solo i pacchetti che iniziano con linux- come nome.
  • | (a pipe) convoglia l'output del comando a sinistra (che chiamiamo stdout ) all'input del comando a destra (che 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 per i pacchetti installati (basandosi sul ii dato da dpkg ). In questo caso, viene addirittura annidato. Sarebbe troppo difficile spiegare l'intero utilizzo di sed qui, poiché il suo uso è molto complicato con le complesse espressioni regolari. (il \(.*\)-\([^0-9]\+\)" è un esempio di espressione regolare.
  • Le espressioni regolari sono molto utilizzate per trovare le corrispondenze in base all'espressione che rappresentano. è il riferimento di sostituzione per fare una sorta di ricerca e sostituzione universali (facendo riferimento al primo 'hit' con 1 ). L'espressione regolare non può causare alcun danno. Tuttavia, se manipolano l'input in modo errato, possono farti rimuovere i pacchetti sbagliati o persino fare un'iniezione di shell. In questo caso sembra un modo per trovare il nome del pacchetto del kernel in base alla versione fornita da uname -r .
  • uname -r mostra la versione corrente del kernel in esecuzione.
  • xargs aggiunge le righe dell'ingresso a sinistra della pipe come argomenti al comando. In questo caso, le versioni del kernel su ogni riga vengono convertite in un elenco separato da spazio orizzontale e aggiunte al comando sudo apt-get .
  • sudo apt-get -y purge [packagename] purges (rimuove tutto) dei pacchetti dati (come argomenti).

Alternative

È probabile che siano già state fatte alcune domande al riguardo. Quelli rilevanti che ho trovato finora:

risposta data gertvdijk 18.01.2013 - 19:40
fonte
7

Hai chiesto una spiegazione passo passo, quindi ecco qui:

sudo dpkg -l 'linux-*'

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

| sed

e inserisci l'elenco in sed

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

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

| xargs

che condurrà il nuovo elenco in xargs , che lo invierà 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à quella lista al comando di eliminazione e lascerà perdere. Se qualcosa è stato eliminato o meno - e soprattutto - esattamente ciò che viene eliminato dipende dall'output dei comandi precedenti.

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

    
risposta data chaskes 18.01.2013 - 19:50
fonte
6

Ho iniziato con la dissezione dei comandi, leggendo la pagina man per ciascuno.

  • dpkg -l : lista pacakges, quindi dpkg -l linux-* dovrebbe elencare tutti i pacchetti iniziati con linux- (di solito kernel).

  • sed : l'output di dpkg -l linux-* viene reindirizzato a sed con diverse espressioni regolari che sed decodifica.

  • uname -r uname stampa le informazioni di sistema

  

uname - stampa le informazioni di sistema

L'handle -r stampa in modo specifico le versioni del kernel:

  

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

L'output di uname -r viene quindi reindirizzato a sed con più espressioni regolari, il cui output viene passato a xargs

Quindi xargs converte l'output sed in nomi pacchetto e li passa a sudo apt-get purge -y che risponde automaticamente a "sì" a tutti i prompt:

  

-y, --yes, --assume-yes              Sì automatico alle richieste; assumere "sì" come risposta a tutti i prompt ed eseguire              in modo non interattivo. Se una situazione indesiderabile, come cambiare un pacchetto in attesa, provare              quindi installare un pacchetto non autenticato o rimuovere un pacchetto essenziale              apt-get verrà interrotto. Elemento di configurazione: APT :: Get :: Assume-Yes.

Complessivamente sembra che questo comando farà come vuoi, anche se per essere sicuro dovremmo tradurre le espressioni regolari di sed .

Ho appena eseguito:

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

qui c'è uno screenshot:

Tutte le vecchie versioni del kernel iirc.

    
risposta data Seth 18.01.2013 - 19:43
fonte

Leggi altre domande sui tag