Я уверен что почти все из вас встречались с таким комментарием: выполни эту команду sudo rm -rf /* и твоя проблема решится.



Но мало кто знает, что эта команда называется «Патч Бармина».



Патч Бармина — шутка, описывающая универсальное средство устранения любых неполадок в Unix-системах. Сам «патч» состоит из одной строки, которую следует набрать в консоли root.



Данная команда действительно устраняет любые неполадки вместе с самой Unix-системой. Поэтому будь аккуратен в своих экспериментах, запускать такое можно только на подопытных стендах ради науки. Надеюсь ты успел дочитать до этого абзаца 🤒 и не побежал проверять на продакшене.



Давай разберем как работает «Патч Бармина»



По умолчанию утилита 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 скриптам, особенно если эти скрипты дернуты у какого нибудь Васи Нонейма.



На этой прекрасной ноте, жму тебе руку и желаю хорошего дня!



tags: #bash #linux



🟢 Подпишись: @bashdays