Czy to polecenie, aby usunąć stare jądra jest bezpieczne w użyciu?

21

Przeglądając artykuły Ubuntu w Internecie, natrafiłem na to polecenie:

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

Autor powiedział, że jest to jedno wierszowe polecenie, które usunie wszystkie poprzednie wersje Linuksa, pozostawiając tylko bieżącą !

Tak naprawdę szukam takiego polecenia, ale nie jestem pewien, czy jest to bezpieczne. Chciałbym wiedzieć:

  • Czy wykonanie tego polecenia jest bezpieczne?
  • Jak działa to polecenie? tzn. wyjaśnienie małych części tak dużego polecenia
  • Jeśli to polecenie służy innemu celowi, to jakie byłoby prawidłowe polecenie, aby osiągnąć to, co autor twierdzi, że zrobił?

Staję się bardzo zdezorientowany i sfrustrowany, gdy staram się wywnioskować wszystko sam. Jak to działa polecenia dla zawiera liczne /, |, \, *, i ^znaki, które są trudne do Google.

Szukam tłumaczenia i wyjaśnienia krok po kroku tego polecenia, którego nie udało mi się znaleźć w Internecie!

Bhavesh Diwan
źródło
1
Nie wydaje się to tym samym poleceniem, które zacytowałeś, ale używałem tego polecenia w tuxtweaks.com/2010/10//… do usuwania starych jąder bez żadnych problemów. Ta strona wyjaśnia również, co robi polecenie.
user68186,
4
@UriHerrera apt-get autoremovenie sugeruje mi usuwania starszych jąder. Jeśli ich nie usunę, będą się gromadzić, dopóki /bootnie zabraknie mi miejsca i aktualizacje się nie powiodą. Czy masz do tego odniesienie, że powinien to zrobić?
gertvdijk
1
Robi to dla mnie, ilekroć pojawia się nowa aktualizacja jądra, mówi potem, że następujące pakiety itp. Nie są już potrzebne i wyświetla poprzednie jądro, które miałem.
Uri Herrera
Moja odpowiedź została usunięta przez moderatora, więc komentuję tutaj: wyjaśnienie skryptu znajduje się w tym artykule . Nie rozumiem, dlaczego jedna część skryptu jest s/^[^ ]* [^ ]* \([^ ]*\).*/\1/po prostu s/^[^ ]* \([^ ]*\).*/\1/. Skrypt nie jest zbyt solidny ani elegancki. Na przykład po co sprawdzać bieżące jądro przed wypakowaniem nazwy pakietu z wyjścia? Alternatywnie, sudo apt-get autoremove --purgeczyści większość starych jąder w najnowszej wersji Ubuntu, takiej jak Xubuntu 15.10.
jarno

Odpowiedzi:

27

Powiedziałbym: nie używaj go w obecnej formie

  1. Wprowadza zmiany bez pytania. Ta apt-get -y purgeczęść umożliwia uruchamianie paczek jednym linkiem bez twojego potwierdzenia. Jeśli istnieje jakikolwiek błąd w skrypcie, możesz zostać przykręcony .

  2. Bez źródła, bez autora. Jego źródło ma tutaj znaczenie. W przypadku, gdyby pochodził z dokładnie przetestowanego pakietu systemowego, możemy prześledzić przeprowadzane na nim testy. Z przypadkowego źródła nie możemy mu ufać.

  3. dpkg -ldziała dobrze bez sudo. Nie rozumiem, dlaczego oryginalny autor uznał to za konieczne.

Użyj rozumu

Usuń szkodliwe części i pomiń wszystko, co działa jako root.

Na przykład zmniejsz to do tego:

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

który tylko wyświetla dane i działa ze zwykłymi uprawnieniami użytkownika . Gdy zgodzisz się na usunięcie tych jąder, możesz dołączyć | xargs sudo apt-get purge się. -yCelowo nie ma takiej opcji, więc zostaniesz poproszony o potwierdzenie zmian, które zostaną wprowadzone w twoim systemie.

Wyjaśnienie

  • dpkg -lWyświetla listę wszystkich pakietów. W takim przypadku wyświetli tylko pakiety zaczynające się linux-od nazwy.
  • |(potok) przekazuje dane wyjściowe polecenia po lewej stronie (nazywamy to stdout) do danych wejściowych polecenia po prawej stronie (nazywamy to stdin).
  • sedto narzędzie do manipulowania ciągami za pomocą wyrażeń regularnych . W tym przypadku manipuluje wyjściem polecenia po lewej stronie potoku i filtruje zainstalowane pakiety (w oparciu o iipodane przez dpkg). W tym przypadku jest nawet zagnieżdżony. Trudno byłoby wyjaśnić tutaj całe użycie sed, ponieważ jego użycie jest bardzo skomplikowane ze względu na złożone wyrażenia regularne. ( \(.*\)-\([^0-9]\+\)"jest przykładem wyrażenia regularnego.
  • Wyrażenia regularne są bardzo szeroko stosowane do znajdowania dopasowań na podstawie wyrażenia, które reprezentują. \1jest odniesieniem zastępującym, aby wykonać rodzaj uniwersalnego wyszukiwania i zamiany (odniesienie do pierwszego „trafienia” za pomocą 1). Samo wyrażenie regularne nie może wyrządzić żadnej szkody. Jeśli jednak manipulują danymi wejściowymi w niewłaściwy sposób, mogą spowodować usunięcie niewłaściwych pakietów lub nawet wstrzyknięcie powłoki. W tym przypadku wygląda to na sposób na znalezienie nazwy pakietu jądra na podstawie wersji dostarczonej przez uname -r.
  • uname -r wyświetla aktualną wersję uruchomionego jądra.
  • xargsdołącza wiersze wejścia po lewej stronie potoku jako argumenty do polecenia. W takim przypadku wersje jądra w każdym wierszu są konwertowane na poziomą listę oddzieloną spacjami i dołączane do sudo apt-getpolecenia.
  • sudo apt-get -y purge [packagename] usuwa (usuwa wszystko) z podanych pakietów (jako argumenty).

Alternatywy

Prawdopodobnie już o to pytano. Odpowiednie, które do tej pory znalazłem:

gertvdijk
źródło
1
jaki będzie rozpad przerażająco wyglądającego węzła tego polecenia, które jest coś w stylu tego /(.*)-([^0-9]\+)/\1/")"'/d;s/^* ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan
czy powyższe polecenie w tej odpowiedzi z wdziękiem wyczyści stare jądra? czy nadal apt-get autorove jest lepszy?
Bhavesh Diwan
4
@ Z9iT Są to wyrażenia regularne. Służą do znajdowania dopasowań na podstawie wyrażenia, które reprezentują, i \1jest formantem zastępującym, który służy do uniwersalnego wyszukiwania i zamiany. Przy usuwaniu jakiegokolwiek opakowania wyraziłem się jasno w mojej odpowiedzi (moim zdaniem): kieruj się zdrowym rozsądkiem. Nie pozwól, aby skrypt automatycznie wprowadzał zmiany w systemie. Sprawdź, co by to zrobił. Zawsze.
gertvdijk
Alternatywna opcja nie usuwa odpowiednich pakietów nagłówka linux.
jarno
Następnie po prostu zrób apt-get autorove, który powinien wykryć, że te nagłówki nie są już potrzebne.
ben-Nabiy Derush,
7

Poprosiłeś o wyjaśnienia krok po kroku, więc oto:

sudo dpkg -l 'linux-*'

Wyświetla listę pakietów zaczynających się od linux-w nazwie pakietu

| sed

i potokuj listę do sed

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

który użyje bardzo skomplikowanego wyrażenia regularnego do edycji listy

| xargs

który potokuje nową listę do xargs, która wyśle ​​ją jako argument do

sudo apt-get -y purge

który oczyści te paczki bez szansy na zmianę zdania.

A może dokładniej jest powiedzieć, że wyśle ​​tę listę do polecenia czyszczenia i zostaw ją przy tym. To, czy coś zostanie oczyszczone - i co ważne - dokładnie to , co zostanie oczyszczone, zależy od wydajności poprzednich poleceń.

Czy to jest bezpieczne? W tym przypadku wszystko zależy od tego, jak dobrze autor postu, w którym go znalazłeś, rozumie wyrażenia regularne i sedskładnię. I są całe książki na oba te tematy.

kolby
źródło
6

Zacząłem od przeanalizowania poleceń, przeczytania mankażdej strony.

  • dpkg -l: list pacakges, więc wyświetlałby dpkg -l linux-*listę wszystkich pakietów, które rozpoczęły się linux-(zwykle jądra).

  • sed: Dane wyjściowe dpkg -l linux-*są przesyłane potokowo sedz kilkoma wyrażeniami regularnymi, które seddekodują.

  • uname -r unamedrukuje informacje o systemie

uname - drukuje informacje o systemie

-rUchwyt specjalnie drukuje komunikaty jądra:

-r, --kernel-release wypisuje wydanie jądra

Dane wyjściowe uname -rsą następnie przesyłane strumieniowo sedz większą liczbą wyrażeń regularnych, których dane wyjściowe są przekazywane doxargs

Więc xargstłumaczy dane sedwyjściowe na nazwy pakietów i przekazuje je, na sudo apt-get purge -yktóre automatycznie odpowiada „tak” na wszystkie monity:

-y, --yes, --assume-yes Automatyczne tak dla podpowiedzi; przyjmij „tak” jako odpowiedź na wszystkie monity i uruchom nieinteraktywnie. Jeśli wystąpi niepożądana sytuacja, taka jak zmiana wstrzymanego pakietu, próba zainstalowania nieuwierzytelnionego pakietu lub usunięcie niezbędnego pakietu, apt-get przerwie działanie. Element konfiguracji: APT :: Get :: Assume-Yes.

W sumie wydaje się to polecenie będzie robić to, co chcesz, ale na pewno wiedzieć, że mamy do przetłumaczenia sed„s wyrażeń regularnych.

Właśnie pobiegłem:

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

oto zrzut ekranu:

wprowadź opis zdjęcia tutaj

Wszystkie stare wersje jądra iirc.

Seth
źródło
jaki jest trening, aby przetłumaczyć wyraz tej sed?
Bhavesh Diwan
2
Próbuję to teraz zrozumieć, może trochę potrwać;)
Seth
Zobacz moją odpowiedź .
jarno
@ Z9iT Byłem zbyt leniwy, aby skopiować wyjaśnienie skryptu z powiązanego artykułu do odpowiedzi, więc chyba Seth usunął moją odpowiedź. Ale myślę, że połączony artykuł jest tym, czego szukałeś w Internecie. Powiedziałem ci również, że jest bezpieczniejszy sposób usuwania starych jąder, chociaż zachowuje 2-3 jądra na wszelki wypadek i może nie działać jeszcze we wszystkich aktualnych wersjach Ubuntu.
jarno
@jarno Usunąłem go, ponieważ Z9iT pytał o konkretne polecenie, a nie bezpieczny sposób usuwania starych jąder. To może być nadal aktualne, ale w komentarzu, a nie odpowiedź :) (tak jak ty)
Seth