Как не стать героем истории «программа удалила мне 800 ГБ»: безопасное рекурсивное удаление в Bash и Python

nikita-practice 31 минуту назад Краткое содержание статьи Как не стать героем истории «программа удалила мне 800 ГБ»: безопасное рекурсивное удаление в Bash и Python 6 мин 1.6K Python * Информационная безопасность *...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. nikita-practice 31 минуту назад Краткое содержание статьи Как не стать героем истории «программа удалила мне 800 ГБ»: безопасное рекурсивное удаление в Bash и Python 6 мин 1. 6K Python * Информационная безопасность * Системное администрирование * Программирование * На этой неделе в топ Хабра попала история о том, как Telegram Desktop при запуске рекурсивно чистил чужую папку C:\custom и унёс около 800 ГБ проектов и программ. Комментарии предсказуемо разделились на «как такое вообще можно выпустить» и «у нас в проекте есть такой же скрипт, просто ему пока везло».
Я отношусь ко второй группе. Почти в любом проекте есть код, который что-то удаляет рекурсивно: очистка кеша, временных файлов, артефактов сборки, старых бэкапов. Пишется он за пять минут, ревьюится по диагонали, и годами работает правильно — до первой пустой переменной или неожиданного симлинка.
Технические детали
Ниже — разбор типичных способов выстрелить себе в ногу и рабочий код на Bash и Python, который эти способы закрывает. Весь код я прогнал на Python 3. 13 и GNU coreutils 9.
Классика жанра: пустая переменнаяСамый известный пример — баг в Steam для Linux в начале 2015 года. В скрипте запуска была строка примерно такого вида:rm -rf "$STEAMROOT/"*Если STEAMROOT по какой-то причине оказывалась пустой (у пострадавшего пользователя её «сломал» перенос папки Steam), строка превращалась в rm -rf "/"*. Дальше — всё, на что у пользователя были права, включая примонтированный диск с бэкапами.
Ещё раньше, в 2011-м, был Bumblebee — проект для гибридной графики NVIDIA на ноутбуках. В установочном скрипте затесался лишний пробел:rm -rf /usr /lib/nvidia-current/xorg/xorgВместо одного пути получилось два, и первым из них был /usr. Обратите внимание: ни в одном из случаев не было «сложного» кода.
Отраслевые последствия
Одна строка, понятная любому джуну. Bash: три строчки, которые стоит писать всегдаset -euo pipefail#! /usr/bin/env bash set -euo pipefailЗдесь нас больше всего интересует -u: обращение к неустановленной переменной становится ошибкой, и скрипт падает.
Важная оговорка: -u не спасает от переменной, которая установлена, но пуста (CACHE_DIR=" . Поэтому одного set -u мало. } прямо в путиrm -rf -- "${CACHE_DIR:?
CACHE_DIR не задан}/"*Конструкция ${VAR:? сообщение} завершает скрипт с ошибкой, если переменная не задана или пуста. Двоеточие тут принципиально: ${VAR?
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



