Просматривая в Интернете статьи об 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 для.
Я ищу пошаговый перевод и объяснение этой команды, которое мне не удалось найти в интернете!
package-management
security
command-line
Бхавеш Диван
источник
источник
apt-get autoremove
не предлагает для меня удаления старых версий ядра. Если я не удаляю их, они просто будут накапливаться, пока у меня не/boot
будет свободного места и обновления не будут выполнены. У вас есть ссылка на это о том, что он должен сделать это?s/^[^ ]* [^ ]* \([^ ]*\).*/\1/
вместо простойs/^[^ ]* \([^ ]*\).*/\1/
. Сценарий не очень надежный или элегантный. Например, зачем проверять текущее ядро перед извлечением имени пакета из вывода? Что касается альтернативы,sudo apt-get autoremove --purge
очищает большинство старых ядер в некоторых последних версиях Ubuntu, таких как Xubuntu 15.10.Ответы:
Я бы сказал: не используйте его в текущей форме
Он вносит изменения, не спрашивая вас. Эта
apt-get -y purge
часть позволяет однострочнику начать выполнение пакетов очистки без вашего подтверждения. Если в скрипте существует какая-либо ошибка, вы можете быть испорчены .Нет источника, автор не указан. Источник этого имеет значение здесь. В случае, если он будет получен из тщательно протестированного системного пакета, мы можем проследить, как на нем проводится тестирование. Из случайного источника, мы не можем доверять этому.
dpkg -l
прекрасно работает безsudo
. Я не понимаю, почему первоначальный автор считал это необходимым.Используй здравый смысл
Удалите вредные части и оставьте все, что работает от имени пользователя root.
Например, сократить это до этого:
который только выводит материал и работает с обычными правами пользователя . Как только вы согласитесь удалить эти ядра, вы можете добавить
| 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
является элементом управления заменой для универсального поиска и замены. Для удаления любого пакета я ясно выразил свой ответ (будучи моим мнением): используйте здравый смысл. Не позволяйте сценарию вносить изменения в вашу систему автоматически. Проверьте, что он будет делать. Всегда.Вы попросили пошаговое объяснение, так что здесь идет:
Перечисляет пакеты, начинающиеся с
linux-
имени пакетаи передать список в
sed
который будет использовать очень сложное регулярное выражение для редактирования списка
который направит новый список в
xargs
, который отправит его в качестве аргументакоторый очистит эти пакеты, не давая вам возможности передумать.
Или, возможно, точнее сказать, что он отправит этот список в команду очистки и оставит все как есть. Будет ли очищено что-либо или, что важно, точно, что очищено, зависит от выходных данных предыдущих команд.
Это безопасно? В этом случае все зависит от того, насколько хорошо автор поста, в котором вы его нашли, понимает регулярные выражения и
sed
синтаксис. И есть целые книги на обе эти темы.источник
Я начал с разбора команд, прочитав
man
страницу для каждого.dpkg -l
: список пакетов, поэтомуdpkg -l linux-*
список всех пакетов, которые начинаются сlinux-
(обычно ядра).sed
: Выходные данныеdpkg -l linux-*
передаютсяsed
с несколькими регулярными выражениями, которыеsed
декодируются.uname -r
uname
печатает системную информацию-r
Ручка специально печатает ядра релизов:Выходные данные
uname -r
затем передаютсяsed
с более регулярными выражениями, выходные данные которых передаютсяxargs
Таким образом,
xargs
преобразовываетsed
выходные данные в имена пакетов и передает их,sudo apt-get purge -y
которые автоматически отвечают «да» на все запросы:В целом кажется, что эта команда будет делать то, что вы хотите, хотя, чтобы знать наверняка, нам придется переводить
sed
регулярные выражения.Я только что побежал:
вот скриншот:
Все старые версии ядра iirc.
источник