Как рекурсивно уничтожить целое дерево каталогов?


48

У меня есть дерево каталогов, которое я хотел бы уничтожить с помощью утилиты Linux 'shred'. К сожалению, -Rу уничтожения нет возможности рекурсивного уничтожения.

Как я могу рекурсивно уничтожить целое дерево каталогов?

Ответы:


46

Используйте findкоманду для выполнения shredрекурсивно:

find <dir> -type f -exec shred {} \;

Работает ли без опции -depth? Работает ли это на современных журналируемых файловых системах?
пользователь неизвестен

@userunknown Нет, shred не работает в современных файловых системах журналирования. Для более точной информации, пожалуйста, смотрите man shred.
FanaticD

Также обратите внимание, что этот метод даже не будет пытаться стереть имена файлов , поэтому любые данные, хранящиеся в таком виде, обязательно останутся позади ( srmиз ответа @ Cookie по крайней мере попытается решить эту проблему).
ntninja

Используйте, -exec shred {} +чтобы сделать это быстрее, так как shred принимает несколько аргументов.
Sumit

28

Остерегайтесь клочья!

Из страницы клочка:

ВНИМАНИЕ: обратите внимание, что уничтожение основано на очень важном допущении: файловая система перезаписывает данные на месте. Это традиционный способ сделать что-то, но многие современные конструкции файловых систем не удовлетворяют этому предположению. Ниже приведены примеры файловых систем, в которых уничтожение неэффективно или не гарантируется, что оно будет эффективно во всех режимах файловой системы:

  • файловые системы со структурой журналов или журналами, например, поставляемые с AIX и Solaris (и JFS, ReiserFS, XFS, Ext3 и т. д.)

  • файловые системы, которые записывают избыточные данные и продолжают работу даже в случае сбоя при записи, например, файловые системы на основе RAID

  • файловые системы, которые делают снимки, такие как NFS-сервер сетевого устройства

  • файловые системы, которые кэшируются во временных расположениях, таких как клиенты NFS версии 3

  • сжатые файловые системы

В случае файловых систем ext3 вышеупомянутый отказ от ответственности применяется (и поэтому уничтожение имеет ограниченную эффективность) только в режиме data = journal, который регистрирует данные файла в дополнение только к метаданным. В режимах data = упорядоченный (по умолчанию) и data = writeback уничтожение работает как обычно. Режимы журналирования Ext3 можно изменить, добавив параметр data = кое-что к параметрам монтирования для конкретной файловой системы в файле / etc / fstab, как описано в справочной странице монтирования (man mount).

Кроме того, резервные копии файловой системы и удаленные зеркала могут содержать копии файла, которые нельзя удалить, и это позволит восстановить уничтоженный файл позже.

Решение: используйте зашифрованную файловую систему и просто удалите свои файлы.


+1 за указатель на клочок, у меня раньше был похожий случай. Это не работает на NFS NetApp. NetApp использует WAFL и использует копирование при записи, включая metajournalling, так что это правильно. Также с последним ZFS Solaris является еще одним случаем, где проливается клочок.
Нихил Мулли

6
Это плохое решение. Зашифрованная файловая система безопасна только в том случае, если она заблокирована (и, следовательно, отключена). Как только ваша ОС запущена и работает, данные становятся доступными.
oleks

3
@oleks: как использование, так shredи шифрование данных предотвращают считывание данных с автономного устройства хранения данных (например, кража или полиция) с помощью шифрования данных, что обеспечивает дополнительную защиту всех файлов, а не только удаленных (должным образом). Как только файловая система смонтирована, мы возвращаемся к хорошим старым разрешениям unix в любом случае, и защита данных снова становится задачей безопасности ОС и надлежащего администрирования системы. Предохранительное шифрование файловой системы определенно не хуже для защиты данных в состоянии покоя, чем стратегическое использование shred!
ntninja

12

Вместо этого используйте безопасное удаление.

sudo apt-get install secure-delete
srm -r pathname

Готово. Безопасное удаление намного более параноидально, чем уничтожение, используя 38 проходов вместо 3. Для быстрого одиночного прохода используйте

srm -rfll pathname

fll дает вам менее случайный генератор данных и только один проход.


Решает ли это проблему, упомянутую в unix.stackexchange.com/a/27075/18886 ?
Ян Данн,

Как это могло? Нет
Cookie

Обратите внимание, что этот метод имеет дополнительное преимущество по сравнению с предлагаемыми findметодами на основе, которые также будут пытаться стереть сохраненные имена файлов путем переименования файлов перед их усечением и отсоединением.
ntninja

Методы @ntninja, основанные на поиске, используют shred, а shred переименовывает файлы перед тем, как их удалять. Так же выгодно ли?
Tuxayo

11

Сочетание этого ответа с наиболее известными вариантами уничтожения с помощью этой ссылки переполнения стека « Удаление файлов навсегда и безопасно в CentOS »:

find <directory> -depth -type f -exec shred -v -n 1 -z -u {} \;

Редактировать: Помните, что лучший ответ для уничтожения одного файла вызывает синхронизацию, которая записывает изменения на носитель перед удалением файла, потому что некоторые или все журнализированные файловые системы имеют буфер.

Если возможно, команда find должна вызвать скрипт оболочки для файла, который выполняется:

shred -v -n 1 /path/to/your/file #overwriting with random data
sync #forcing a sync of the buffers to the disk
shred -v -n 0 -z -u /path/to/your/file #overwriting with zeroes and remove the file

на каждом файле.


Прочитав и изучив много ответов, я нашел (imho) этот ответ наиболее полным. Я бы только добавил к этому, что, поскольку shred не удаляет каталоги, я добавил rm -rvf $1к сценарию оболочки (где $ 1 - файл / path / to / your /, переданный из {}расширения в find... -exec)
JoelAZ

4
shred уже выполняет fsync (2) после каждого прохода. Именно потому, что вам нужно заставить изменения файла достичь диска до следующего прохода.
Анхель

Что depthздесь делать? Также не уверен насчет обратной косой черты
Geneorama

5
find /your/directory -exec shred {} \;

Проголосовал, но Джеймс избил тебя на одну минуту за согласие.
Стив В.

Работает ли без опции -depth? Работает ли это на современных журналируемых файловых системах?
пользователь неизвестен

3
find [dirname] -depth -type f -exec shred -n1 {} \;

При этом выполняется поиск в глубину файлов в каталоге [dirname], затем выполняется shred -n1команда для каждого файла. При удалении файлов и / или каталогов добавление -depthпо умолчанию является хорошей привычкой, хотя в этом случае это не является строго обязательным. При выполнении такого рода команды с rm -rfвместо shred, -depthнеобходимо обеспечить, чтобы каталоги не удалялись до того, как будет пытаться удалить содержимое каталогов (что приведет к ошибкам).


3
Вы должны использовать shred -N 1, потому что по умолчанию, измельчая 3 раза, змеиное масло. Либо одного раза достаточно, либо 30 раз не получится.
пользователь неизвестен

Предоставление простой команды в качестве ответа не лучший способ ответить на вопрос. Я бы рекомендовал добавить небольшое объяснение о том, что делает линия и возможные ограничения, связанные с ее использованием.
n0pe

0

Самый тщательный shredметод, который я нашел, включая удаление каталогов, - это findвызвать скрипт для shred:

  • переписать файл
  • синхронизация
  • затем удалите
  • и, наконец, вызовите rm, чтобы удалить имена каталогов.

Этот метод также правильно обрабатывает имена файлов с пробелами в них.

Первый - shredскрипт (я назвал мой dirShredder.shи сохранил его в /rootкаталоге:

shred -v -n 1 "$1" #overwriting with random data
sync #forcing a sync of the buffers to the disk
shred -v -n 0 -z -u "$1" #overwriting with zeroes and remove the file
rm -rvf "$1" # call rm to remove the directories

Затем вызовите скрипт следующим образом:

find /volume1/pathToShred/ -mindepth 1 -depth -exec /root/dirShredder.sh "{}" \;

Обязательно пометьте killit.shфайл executetable ( chmod +x) и, конечно, обновите путь к каталогу, который вы хотите уничтожить, и, dirShredder.shесли вы храните его где-то еще.

NOTA BENE - shredимеет проблемы с файловыми системами копирования при записи (ZFS, BTRFS и др.) И даже с файловыми системами журналирования. Не существует общепринятого «лучшего» способа справиться с этим, который я нашел, кроме «зашифрованных файловых систем», но я не уверен, насколько он эффективен по факту.
Самое близкое, что вы можете получить, - это перезаписать все пустое место на диске случайными данными после операций удаления (не нулями, кажется, это не всегда надежно.) Кроме того, у SSD могут быть и другие соображения (например, TRIM).

Я не буду вдаваться в подробности, есть и другие ответы в стеке (например, ответ @user unknown в этом вопросе) и множество обсуждений в сети, которые охватывают эти темы, поэтому ищите их, если вам нужен такой уровень безопасности.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.