Чи безпечна для використання ця команда для видалення старих ядер?


21

Переглядаючи статті Ubuntu в Інтернеті, я натрапив на цю команду:

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

Автор сказав, що це однорядкова команда, яка видалить усі попередні версії Linux, залишивши лише поточну !

Я насправді шукаю таку команду, але я не дуже впевнений, наскільки це безпечно. Я хотів би знати:

  • Чи безпечно виконувати цю команду?
  • Як працює ця команда? тобто пояснення малих частин такої великої команди
  • Якщо ця команда служить якійсь іншій меті, то яка б була правильна команда для досягнення того, що автор вимагає зробити?

Мені стає дуже розгублено і розчаровано, коли я намагаюся зробити все самі. Як ця команда працюватиме на ньому численні /, |, \, *, і ^символи , які важко Google для.

Я шукаю покроковий переклад та пояснення цієї команди, яку мені не вдалося знайти в Інтернеті!


1
Здається, це не та сама команда, яку ви цитуєте, але я використовував команду в tuxtweaks.com/2010/10/…, щоб видалити старі ядра без проблем. На цій сторінці також пояснено, що робить команда.
user68186

4
@UriHerrera apt-get autoremoveне пропонує мені видаляти старіші ядра. Якщо я не видалю їх, вони просто збиратимуться, поки моє не залишиться /bootмісця та оновлення не завершиться. Чи є у вас посилання на те, що це має робити?
gertvdijk

1
Це робить для мене кожен раз, коли з'являється нове оновлення для ядра, після чого вказано, що наступні пакунки тощо більше не потрібні, і він перераховує попереднє ядро, яке у мене було.
Урі Еррера

Мою відповідь модератор видалив, тому я коментую тут: Дивіться цю статтю для пояснення сценарію. Я не бачу, чому одна частина сценарію s/^[^ ]* [^ ]* \([^ ]*\).*/\1/замість просто s/^[^ ]* \([^ ]*\).*/\1/. Сценарій не дуже надійний або елегантний. Наприклад, навіщо перевіряти поточне ядро ​​перед вилученням імені пакета з виводу? Що стосується альтернативи, sudo apt-get autoremove --purgeочищає найдавніші ядра в останній версії Ubuntu, як Xubuntu 15.10.
jarno

Відповіді:


27

Я б сказав: не використовуйте його в поточній формі

  1. Він вносить зміни, не запитуючи вас. apt-get -y purgeЧастина дозволяє один вкладиш , щоб почати виконання продувки пакетів, без підтвердження. Якщо в скрипті є якась помилка, то вас можуть накрутити .

  2. Ні джерела, ні автора не вказано. Джерело цього має значення. У випадку, якщо він вийшов з ретельно перевіреного системного пакету, ми можемо простежити тестування, яке проводиться на ньому. З випадкового джерела ми не можемо йому довіряти.

  3. dpkg -lдобре працює без sudo. Я не бачу, чому оригінальний автор вважав це необхідним.

Використовуйте здоровий глузд

Видаліть шкідливі частини і залиште все, що працює як корінь.

Наприклад, скоротіть це до цього:

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

який лише виводить матеріали та працює з регулярними дозволами користувачів . Після того, як ви погодилися з видаленням цих ядер, ви можете додати | xargs sudo apt-get purge себе. Це без -yможливості, навмисно, тому від вас попросять підтвердження щодо змін, які потрібно внести у вашу систему.

Пояснення

  • dpkg -lВиводить список усіх пакетів. У цьому випадку він відображатиме лише список пакунків, починаючи з linux-назви.
  • |(труба) передає висновок команди зліва (ми це називаємо stdout) на вхід команди справа (ми називаємо це stdin).
  • sedє інструментом для маніпулювання рядками, використовуючи регулярні вирази . У цьому випадку він маніпулює висновком команди зліва від труби та фільтрує встановлені пакети (спираючись на те ii, що задано dpkg). У цій справі він навіть вкладений. Було б надто важко пояснити все використання sedтут, оскільки його використання дуже складне зі складними регулярними виразами. ( \(.*\)-\([^0-9]\+\)"приклад є регулярним виразом.
  • Регулярні вирази дуже широко використовуються для пошуку збігів на основі вираження, який вони представляють. \1є посиланням на заміну, щоб зробити свого роду універсальним пошуком і заміною (посиланням на перший 'хіт' 1). Сам регулярний вираз не може шкодити. Однак якщо вони маніпулюють введенням неправильно, вони можуть змусити вас видалити неправильні пакети або навіть зробити інжекцію оболонки. У цьому випадку це виглядає як спосіб знайти ім'я пакета ядра на основі версії, наданої програмою uname -r.
  • uname -r виводить поточну версію ядра, що працює.
  • xargsдодає рядки вводу зліва від труби як аргументи до команди. У цьому випадку версії ядра у кожному рядку перетворюються у горизонтальний розділений пробілом список та додаються до sudo apt-getкоманди.
  • sudo apt-get -y purge [packagename] очищає (видаляє все) наданих пакетів (як аргументи).

Альтернативи

Досить певного питання, напевно, вже про це задають. Відповідні, які я знайшов поки що:


1
яким буде розрив страшно виглядаючого вузла цієї команди, який є приблизно таким /(.*)-( evidence^0-9Sense\+)/\1/")"'/d;s/^ evidence^ ] * [^] * ([^] *). * / \ 1 /; /
Бхавеш Діван

чи буде згадана вище команда у цій відповіді витончено очистити старі ядра ?? чи все-таки вдаліше отримати авторемонту краще ??
Bhavesh Diwan

4
@ Z9iT Це регулярні вирази. Вони використовуються для пошуку збігів на основі вираження, який вони представляють, і \1це елемент управління заміною, щоб зробити якусь універсальну систему пошуку та заміни. Для видалення будь-якого пакету я висловився чітко у своїй відповіді (будучи моєю думкою): використовуйте здоровий глузд. Не дозволяйте сценарію вносити зміни до вашої системи автоматично. Перевірте, що це зробить. Завжди.
gertvdijk

Альтернатива, яку ви маєте, не очищає відповідні пакети linux-header.
jarno

Тоді просто зробіть придатний авторемонт, який повинен виявити, що ці заголовки більше не потрібні.
Бен-Набій Деруш

7

Ви попросили покрокове пояснення, тож ось:

sudo dpkg -l 'linux-*'

Списки пакетів, починаючи з linux-імені пакета

| sed

і передати список sed

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

який буде використовувати дуже складний регулярний вираз для редагування списку

| xargs

який передасть новий список у xargsякий надсилатиме його як аргумент

sudo apt-get -y purge

яка очистить ці пакунки, не даючи вам шансу передумати.

Або, можливо, точніше сказати, що він відправить цей список у команду очищення та залишить його при цьому. Від того, чи все чиститься чи ні - і що важливо - саме те , що очищено, залежить від результату попередніх команд.

Це безпечно? У цьому випадку все залежить від того, наскільки добре автор публікації, де ви його знайшли, розуміє регулярні вирази та sedсинтаксис. І на ці обидві теми є цілі книги.


6

Я почав з розчленування команд, зчитування manсторінки для кожної.

  • dpkg -l: список pacakges, так dpkg -l linux-*би перераховував усі пакунки, які починалися з linux-(зазвичай ядра).

  • sed: Вихідні дані dpkg -l linux-*переносяться sedкількома регулярними виразами, які sedдекодуються.

  • uname -r unameдрукує системну інформацію

uname - друкувати інформацію про систему

-rРучка спеціально друкує ядра релізів:

-r, --kerker-release надрукувати випуск ядра

Потім вихідний сигнал uname -rпередається sedбільш регулярним виразам, вихід якого передаєтьсяxargs

Так xargsпереводить sedвихід у назви пакетів і передає їх, на sudo apt-get purge -yякий автоматично відповідає "так" на всі підказки:

-y, --yes, --assume-так Автоматично так для підказок; візьміть "так" як відповідь на всі підказки та запустіть неінтерактивно. Якщо виникає небажана ситуація, наприклад, зміна утримуваного пакету, спроба встановити несанкціонований пакет або вилучення необхідного пакету, тоді apt-get припиниться. Елемент конфігурації: APT :: Get :: Припустимо-Так.

В цілому, здається , ця команда буде робити те , що ви хочете, хоча знати , що ми повинні були б перевести sed«s регулярні вирази.

Я щойно бігав:

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

ось скріншот:

введіть тут опис зображення

Усі старі версії ядра iirc.


яка тренування, щоб перекласти вираз цього седа?
Bhavesh Diwan

2
Я намагаюся зрозуміти це зараз, може зайняти трохи часу;)
Сет

Дивіться мою відповідь .
jarno

@ Z9iT Мені було дуже лінь копіювати пояснення сценарію із пов'язаної статті до відповіді, тож я здогадуюсь, що тому Сет видалив мою відповідь. Але я думаю, що пов’язана стаття - це те, що ви шукали з Інтернету. Я також сказав вам більш безпечний спосіб видалення старих ядер, хоча він зберігає 2-3 ядра на всякий випадок і, можливо, ще не працює у всіх поточних випусках Ubuntu.
jarno

@jarno Я видалив її, тому що Z9iT запитував про певну команду, а не про безпечний спосіб видалення старих ядер. Це все ще може бути актуальним, але у коментарі не відповідь :) (як і ви)
Seth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.