Есть ли недостатки в использовании rm $ (ls) для удаления файлов?

Мне было интересно, безопасно ли использовать rm $(ls) для удаления файлов (или rm -r $(ls) для удаления каталогов)? Потому что на всех сайтах люди дают другие способы сделать это, хотя эта команда кажется намного проще, чем другие команды.

1
задан 3 September 2016 в 05:01

1 ответ

Нет, это небезопасно, и обычно используемая альтернатива rm * не намного безопаснее.

С rm $(ls) существует множество проблем. Как уже отмечалось в ответах других, вывод ls будет разделен на символы, присутствующие во внутреннем разделителе полей.

Лучший сценарий, он просто не работает. В худшем случае вы хотели удалить только файлы (но не каталоги) & ndash; или выборочно удалить некоторые файлы с помощью -i & ndash; но в текущем каталоге есть файл с именем c -rf. Давайте посмотрим, что произойдет.

$ mkdir a
$ touch b
$ touch 'c -rf'
$ rm -i $(ls)
$ ls
c -rf

Команда rm -i $(ls) должна была удалить только файлы и спросить перед удалением каждого из них, но команда, которая была в конечном счете выполнена, прочитала

rm -i a b c -rf
[d6 ], поэтому он сделал что-то еще.

Обратите внимание, что rm * только немного лучше. С структурой каталогов, как и раньше, он будет вести себя так, как предполагалось, но если у вас есть файл с именем -rf, вам все равно не повезло.

$ mkdir a
$ touch b
$ touch ./-rf
$ rm -i *
$ ls
-rf

Существует несколько лучших альтернатив.

Команда
rm -- *
будет работать точно так, как предполагалось, где -- сигнализирует, что все после нее не должно интерпретироваться как опция , Это уже более двух десятилетий является частью руководства по синтаксису утилиты POSIX. Он широко распространен, но вы не должны ожидать, что он будет присутствовать везде. Команда
rm ./*
заставляет glob расширяться по-разному и, следовательно, не требует поддержки от вызываемой утилиты. Для моего примера сверху вы можете увидеть команду, которая в конечном итоге будет выполнена путем добавления echo.
$ echo rm ./*
rm ./a ./b ./-rf
Ведущий ./ предотвращает случайное обращение к любому из имен файлов, таких как параметры.
28
ответ дан 23 May 2018 в 06:31
  • 1
    Очень хорошая точка, имена файлов с - после расширения становятся флажками rm. +1 – Sergiy Kolodyazhnyy 3 September 2016 в 07:43
  • 2
    Даже противнее: touch 'foo -rf .. bar. Я не думаю, что злоумышленник может получить больше, чем родительский каталог, если мы не сможем создать разделитель путей в выходе ls. – Peter Cordes 3 September 2016 в 12:23
  • 3
    У злоумышленника @Peter должно быть разрешение на запись, чтобы удалить патентный каталог, в первую очередь, нет? – Sergiy Kolodyazhnyy 3 September 2016 в 19:36
  • 4
    @PeterCordes Я не уверен, что все версии rm имеют это безотказное, но на Ubuntu, openSUSE и Fedora, он говорит rm: refusing to remove '.' or '..' directory: skipping '..' или что-то подобное при попытке удалить родительский каталог. – Dennis 3 September 2016 в 20:11
  • 5
    @Serg: злоумышленник просто отправляет вам .zip с этим именем файла в нем и позволяет вам стрелять в ногу, извлекая его, а затем пытаясь удалить содержимое. Или создав это имя файла в / var / tmp или что-то в этом роде. – Peter Cordes 3 September 2016 в 21:56

Другие вопросы по тегам:

Похожие вопросы: