Устранил финальный недостаток SHRED под Windows в BAT-файле.
Про shred в версии под винды, рассказывал здесь (копия)
И рассказал там про фатальный недостаток утилиты, затирая и удаляя файл она никак не меняет его имени, потому, если вы shred
'ом удалили файл, например, с именем Путин бомба взрыв чеченцы.doc
, содержимое файла затрется, а название останется. Сделал обертку в виде BAT-файла, чтобы сей недостаток устранить:
Самый простой способ, это просто использовать переменную
%RANDOM%
, например, в таком виде:%TEMP%\%RANDOM%.%RANDOM%
Вариант сгенерированного имени:
C:\Windows\Temp\20422.19028
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%
в винде.На GitHub
Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2023/05/05/ust