Является ли эта команда безопасным для удаления старых ядер?

21

Во время просмотра Интернета для статей Ubuntu я наткнулся на эту команду:

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

Автор сказал, что это одна строка, которая будет удалять все предыдущие версии Linux, оставив только текущий !

Я действительно ищу такую ​​команду, но я не уверен, насколько это безопасно. Я хотел бы знать:

  • Можно ли выполнить эту команду безопасно?
  • Как эта команда работает? то есть объяснение небольших частей такой большой команды
  • Если эта команда служит для разных целей, то какова будет правильная команда для достижения того, что автор утверждает, что она делает?

Я очень запутался и разочаровался, когда попытался вывести все из себя. Как эта команда работает для нее, она содержит многочисленные / , | , \ , * и ^ символов, которые трудно использовать для Google.

Я ищу поэтапный перевод и amp; объяснение для этой команды, которую я не смог найти в Интернете!

    
задан Z9iT 18.01.2013 в 19:20
источник

3 ответа

26

Я бы сказал: не используйте его в текущей форме

  1. Он вносит изменения, не спрашивая вас. Часть apt-get -y purge позволяет однострочному устройству запускать пакеты очистки, без вашего подтверждения. Если какая-либо ошибка в скрипте существует, вы можете быть ввернутым .

  2. Нет источника, автор не указан. Здесь источник имеет здесь значение. В случае, если это исходит из тщательно протестированного системного пакета, мы можем проследить за выполнением тестирования на нем. Из случайного источника мы не можем доверять ему.

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

Использовать здравый смысл

Удалите вредные части и оставьте все, что работает с правами root.

Например, сократите это до:

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

, который просто выводит только материал и запускает с правами обычного пользователя . Как только вы согласитесь с этими ядрами, которые вы хотите удалить, вы можете добавить | xargs sudo apt-get purge самостоятельно. Это без опции -y , намеренно, поэтому вам будет предложено подтвердить изменения, которые будут внесены в вашу систему.

Объяснение

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

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

Вероятно, об этом уже задают некоторые вопросы. Релевантные, которые я нашел до сих пор:

  • Как очистить предыдущие ядра после обновления?
  • Как удалить старые версии ядра для очистки меню загрузки?
  • В этом ответе следующая команда, похоже, делает то же самое более безопасным и более распространенным способом:

    sudo apt-get purge $( dpkg --list | grep -P -o "linux-image-\d\S+" | grep -v $(uname -r | grep -P -o ".+\d") )
    
ответ дан gertvdijk 18.01.2013 в 19:40
источник
6

Вы попросили пошаговое объяснение, вот так:

sudo dpkg -l 'linux-*'

Перечисляет пакеты, начинающиеся с linux- в имени пакета

| sed

и переместите список в sed

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

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

| xargs

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

sudo apt-get -y purge

, который очистит эти пакеты, не давая вам возможности передумать.

Или, может быть, более точно сказать, что он отправит этот список в команду очистки и оставит его на этом. Независимо от того, очищено ли или нет - и что важно - точно то, что очищено , зависит от вывода предыдущих команд.

Это безопасно? В этом случае все зависит от того, насколько хорошо автор сообщения, где вы его нашли, понимает регулярные выражения и синтаксис sed . И есть целая книга по обеим темам.

    
ответ дан chaskes 18.01.2013 в 19:50
6

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

  • dpkg -l : список pacakges, поэтому dpkg -l linux-* будет перечислять все пакеты, которые начинались с linux- (обычно ядра).

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

  • uname -r uname печатает системную информацию

  

uname - распечатать системную информацию

Обработчик -r специально печатает версии ядра:

  

-r, --kernel-release распечатать версию ядра

Результат uname -r затем передается по каналу sed с более регулярными выражениями, выход которых передается в xargs

Итак, xargs переводит выход sed в имена пакетов и передает их на sudo apt-get purge -y , который автоматически отвечает «да» на все приглашения:

  

-y, --yes, --assume-yes              Автоматическое да для подсказок; предположите «да» в качестве ответа на все приглашения и запустите              неинтерактивно. Если возникает нежелательная ситуация, например, изменение удерживаемого пакета, попытка              для установки пакета без проверки подлинности или удаления необходимого пакета              apt-get прервется. Элемент конфигурации: APT :: Get :: Предположим-Да.

В целом кажется, что эта команда будет делать то, что вы хотите, хотя, чтобы точно знать, что нам придется переводить регулярные выражения sed .

Я только что побежал:

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

вот скриншот:

Все старые версии ядра iirc.

    
ответ дан Seth 18.01.2013 в 19:43