В приведенном ниже сценарии, если 1-я строка является строкой шебанга, новый контент будет вставлен во 2-ю строку. В противном случае он будет вставлять содержимое в 1-ю строку
.Проверено, работает нормально
#!/bin/bash
if [[ `awk 'NR==1 && $1 == "#!/bin/bash" {print $1}' file` == "#!/bin/bash" ]]
then
sed '2i content' file
else
sed '1i content' l.txt
fi
Я бы не рекомендовал «очищать» жесткие диски (, особенно твердотельные накопители ), записывая блоки через dd
на диск. Вместо этого я бы использовал команду безопасного стирания ATA (, если она поддерживается диском ). Дополнительные сведения см. в Kernel.org Wiki -ATA Secure Erase .
Преамбула :воспринимайте ее как прототип, просто как пример для обсуждения.
Я модифицировал Perl-скрипт , который я использую для ускорения md5sum для больших файлов (>TB ),и сделал (действительно грубый )bash-скрипт, чтобы выполнить какую-то операцию, а затем вызвать ее. Основная идея, стоящая за этим:
С этого момента предстоит многое сделать, уточнить количество блоков и байтов для обработки, произвольно сдвинуть блоки, внедрить криптозащищенную библиотеку для генерации случайных чисел, внедрить защитные сценарии и т. д.
Но достаточно болтовни для прототипа.
Вот perlwipe.pl:
#!/usr/bin/perl
use strict;
use Time::HiRes qw[ time ];
sub round_potenza {
my $rounded = 0;
my ($x,$p) = (@_,2);
my $log = log($x)/log($p);
$log = int($log+1) if $log != int($log);
if ( abs($x-($p**$log))> abs($x-($p**int($log-1))) ) {
$rounded = $p**($log-1);
} else {
$rounded = $p**$log;
}
return $rounded;
}
sub quickWipe {
my $fh = shift;
my $charset = shift;
my $pos = 0;
my $size = -s $ARGV[0];
my $chunkraw = int($size/50000);
my $chunk = round_potenza($chunkraw);
printf $chunk;
until( eof $fh ) {
seek $fh, $pos, 0;
my $garbage = rand(10);
read( $fh, my $block, 4096 ) or last;
print $fh $garbage;
$pos += $chunk;
}
}
open FH, '+<', $ARGV[0] or die $!;
printf "Processing $ARGV[0] : %u bytes\n", -s FH;
my $start = time;
my $wipe = quickWipe( *FH );
printf "Fast Wipe took %.6f seconds\n", time() - $start;
А это Bash-скрипт wipeskipping.sh, довольно -объяснительный:
#!/bin/bash
#HANDLE WITH CARE!
if [ $# -eq 0 ]; then
echo "You like to live dangerously."
exit 0
else
DEVICE="/dev/$1"
PARTITION="1"
PARTEDCMD="/tmp/partedcmd"
MOUNTPOINT="/tmp/mountpoint"
/sbin/wipefs -a -f $DEVICE
echo mklabel gpt> $PARTEDCMD
echo mkpart primary 0% 100%>> $PARTEDCMD
echo quit>> $PARTEDCMD
/sbin/parted $DEVICE <$PARTEDCMD
/sbin/mkfs.ext4 -F $DEVICE$PARTITION
mkdir $MOUNTPOINT
mount $DEVICE$PARTITION $MOUNTPOINT
/usr/bin/fallocate -l 5000G $MOUNTPOINT/sparsefile
/usr/bin/perl perlwipe.pl $MOUNTPOINT/sparsefile
fi
В настоящее время, со всеми ограничениями и проблемами, все это примерно в 10 раз быстрее, чем dd из случайного источника в моей лаборатории.
Использование:./wipeskipping.sh sd[X]