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!
package-management
security
command-line
Bhavesh Diwan
źródło
źródło
apt-get autoremove
nie sugeruje mi usuwania starszych jąder. Jeśli ich nie usunę, będą się gromadzić, dopóki/boot
nie zabraknie mi miejsca i aktualizacje się nie powiodą. Czy masz do tego odniesienie, że powinien to zrobić?s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
po prostus/^[^ ]* \([^ ]*\).*/\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 --purge
czyści większość starych jąder w najnowszej wersji Ubuntu, takiej jak Xubuntu 15.10.Odpowiedzi:
Powiedziałbym: nie używaj go w obecnej formie
Wprowadza zmiany bez pytania. Ta
apt-get -y purge
część umożliwia uruchamianie paczek jednym linkiem bez twojego potwierdzenia. Jeśli istnieje jakikolwiek błąd w skrypcie, możesz zostać przykręcony .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ć.
dpkg -l
działa dobrze bezsudo
. 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:
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ę.-y
Celowo nie ma takiej opcji, więc zostaniesz poproszony o potwierdzenie zmian, które zostaną wprowadzone w twoim systemie.Wyjaśnienie
dpkg -l
Wyś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 tostdout
) do danych wejściowych polecenia po prawej stronie (nazywamy tostdin
).sed
to 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 oii
podane przezdpkg
). W tym przypadku jest nawet zagnieżdżony. Trudno byłoby wyjaśnić tutaj całe użyciesed
, 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.\1
jest 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 przezuname -r
.uname -r
wyświetla aktualną wersję uruchomionego jądra.xargs
dołą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 dosudo apt-get
polecenia.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:
Na podstawie tej odpowiedzi następujące polecenie wydaje się robić to samo w znacznie bezpieczniejszy i bardziej powszechny sposób:
źródło
\1
jest 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.Poprosiłeś o wyjaśnienia krok po kroku, więc oto:
Wyświetla listę pakietów zaczynających się od
linux-
w nazwie pakietui potokuj listę do
sed
który użyje bardzo skomplikowanego wyrażenia regularnego do edycji listy
który potokuje nową listę do
xargs
, która wyśle ją jako argument doktó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
sed
składnię. I są całe książki na oba te tematy.źródło
Zacząłem od przeanalizowania poleceń, przeczytania
man
każdej strony.dpkg -l
: list pacakges, więc wyświetlałbydpkg -l linux-*
listę wszystkich pakietów, które rozpoczęły sięlinux-
(zwykle jądra).sed
: Dane wyjściowedpkg -l linux-*
są przesyłane potokowosed
z kilkoma wyrażeniami regularnymi, któresed
dekodują.uname -r
uname
drukuje informacje o systemie-r
Uchwyt specjalnie drukuje komunikaty jądra:Dane wyjściowe
uname -r
są następnie przesyłane strumieniowosed
z większą liczbą wyrażeń regularnych, których dane wyjściowe są przekazywane doxargs
Więc
xargs
tłumaczy danesed
wyjściowe na nazwy pakietów i przekazuje je, nasudo apt-get purge -y
które automatycznie odpowiada „tak” na wszystkie monity: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:
oto zrzut ekranu:
Wszystkie stare wersje jądra iirc.
źródło