Про shred в версии под винды, рассказывал здесь (копия)
И рассказал там про фатальный недостаток утилиты, затирая и удаляя файл она никак не меняет его имени, потому, если вы shred
‘ом удалили файл, например, с именем Путин бомба взрыв чеченцы.doc
, содержимое файла затрется, а название останется. Сделал обертку в виде BAT-файла, чтобы сей недостаток устранить:
Временное имя файла в BAT-скрипте
Самый простой способ, это просто использовать переменную %RANDOM%
, например, в таком виде:
%TEMP%\%RANDOM%.%RANDOM%
Вариант сгенерированного имени:
C:\Windows\Temp\20422.19028
Содержимое BAT-файла
1. Генерируем имя для списка файлов, обработанных shred
:
set RLST=%TEMP%\%RANDOM%.%RANDOM%
По-хорошему надо бы проверить, существует ли такой файл, если существует, сгенерировать новое имя, но тут это единственное имя файла, которое может попасть на существующий файл — в общем, я забил на это.
2. Вызываем shred
:
shred -n 3 -z -v %1 2>%RLST%
где:
-n 3
— количество проходов для затирания содержимого файла
-z
— дополнительный проход, содержимое файла затирается нолями (символом с кодом 0)
-v
— режим подробного вывода на консоль, он пойдет в файл, там будут имена затертых файлов, они понадобятся далее.
2>
shred
выводит данные на STDERR
— перенаправляем вывод в файл, чье имя содержится в переменной %RLST%
.
Содержимое файла из переменной %RLST%
:
>rshred.bat *.txt
shred: 1.txt: pass 1/4 (random)...
shred: 1.txt: pass 2/4 (random)...
shred: 1.txt: pass 3/4 (random)...
shred: 1.txt: pass 4/4 (000000)...
shred: 2.txt: pass 1/4 (random)...
shred: 2.txt: pass 2/4 (random)...
shred: 2.txt: pass 3/4 (random)...
shred: 2.txt: pass 4/4 (000000)...
shred: 3.txt: pass 1/4 (random)...
shred: 3.txt: pass 2/4 (random)...
shred: 3.txt: pass 3/4 (random)...
shred: 3.txt: pass 4/4 (000000)...
shred: readme.txt: pass 1/4 (random)...
shred: readme.txt: pass 2/4 (random)...
shred: readme.txt: pass 3/4 (random)...
shred: readme.txt: pass 4/4 (000000)...
В цикле вытаскиваем из временного файла (%RLIST%
):
FOR /F "tokens=2,5 delims=: " %%i in (%RLST%) do (
[в цикле]
)
Справка по команде FOR
BAT-файла (копия в PDF)
3. В выводе имя файла повторяется несколько раз, потому будем искать строчку, где файл упоминается последний раз ((000000)
):
IF "%%j" EQU "(000000)..." (
[ниже код после проверки]
)
4. Получаем временное имя файла:
set TMPNAME=%RANDOM%.%RANDOM%
5. Переименовываем обработанный файл в случайное имя, полученное выше:
ren %%i !TMPNAME!
6. Удаляем переименованный файл:
del !TMPNAME!
7. После цикла отключаем установку локальных параметров:
Setlocal DisableDelayedExpansion
Справка по команде (копия в PDF)
8. Затираем и удаляем сам файл с логом из %RLST%
:
::remove list of files
shred -n 3 -z %RLST%
del %RLST%
Минус скрипта, который даже плюс:
У группы удаляемых файлов в цикле будет одно и то же имя файла, из-за хреновой работы %RANDOM%
в CMD (копия), но почему это минус, который плюс — при анализе диска не будет видно, сколько именно файлов было удалено (проверено в WinHex).
Минус скрипта, который минус:
Имя временного файла весьма характерное, при анализе диска будет видно, что кто-то скриптом пользовался. Как сделать нормальные случайные имена файлов в CMD (вида lfcx16.tmp
, например) без внешних утилит, я пока не понял, опять же, из-за косячного %RANDOM%
в винде.
BAT-файл целиком
На GitHub