Устранил финальный недостаток SHRED под Windows в BAT-файле.

Про 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *