Я уверен, что почти все из вас встречались с таким комментарием: выполни эту команду sudo rm -rf /*, и твоя проблема решится.
Но мало кто знает, что эта команда называется «Патч Бармина».
Патч Бармина — шутка, описывающая универсальное средство устранения любых неполадок в Unix-системах. Сам «патч» состоит из одной строки, которую следует набрать в консоли root.
Надеюсь, ты успел дочитать до этого абзаца и не побежал проверять на продакшене.
Давай разберём, как работает «Патч Бармина»
По умолчанию утилита rm проверяет аргументы командной строки на соответствие корневой директории. Если в rm передан аргумент /, то выведется предупреждение. Но с помощью опции --no-preserve-root это предупреждение можно отключить.
В случае команды rm -rf /* аргументами будет содержимое корневой директории. Оболочка Bash передаст команде rm список. Чтобы посмотреть, что будет в списке, выполни:
printf '%s\n' /*
Выведется список папок и файлов. Но корневой директории в этом списке не будет. Ну а дальше команда rm начнёт удалять всё, до чего сможет дотянуться. Даже если её запустить под обычным пользователем, многие файлы будут удалены.
Достаточно, чтобы процессу были доступны чтение/запись/исполнение (rwx) для директории, в которой будут удаляться файлы. Ну и чтение/исполнение (r-x) на компоненты пути до этой директории.
Права на чтение не обязательны, если известен полный путь и он задан в качестве аргумента.
К примеру, этой командой rm -ri /* давай удалим содержимое домашней директории пользователя. Но перед каждым удалением будет задаваться вопрос (ключ -i).
rm: спуститься в защищённый от записи каталог '/boot'?
rm: спуститься в защищённый от записи каталог '/dev'?
rm: спуститься в защищённый от записи каталог '/etc'?
rm: спуститься в защищённый от записи каталог '/home'? y
rm: спуститься в каталог '/home/user'? y
rm: удалить обычный файл '/home/user/.bashrc?
Если мне что-то не нужно удалять, я просто нажимаю Enter, а для положительного ответа набираю «y» и жму Enter.
Также имеется ещё одна опция --preserve-root. Без аргументов эта опция как раз и включает проверку, которую отключает --no-preserve-root. При задании этой опции с аргументом all директории, чьи родители находятся на другой файловой системе — то, что было смонтировано, — пропускаются. Например, домашняя папка пользователя находится на отдельном разделе.
rm -ri --preserve-root=all /*
Вывод будет таким:
rm: пропускается '/dev', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
rm: пропускается '/run', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
rm: пропускается '/tmp', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
--no-preserve-root, команда rm может знатно начудить.Всегда гугли/читай, прежде чем бездумно копировать и запускать. Ну и всегда пробегайся глазами по чужим Bash-скриптам, особенно если эти скрипты дёрнуты у какого-нибудь Васи Нонейма.
На этой прекрасной ноте жму тебе руку и желаю хорошего дня!







