Псевдо-устройство /dev/urandom
вместе с dd
может сделать это для вас:
dd if=/dev/urandom of=newfile bs=1M count=10
Это создаст файл newfile
размером 10M.
Устройство /dev/random
часто блокируется, если не сформировано достаточное количество случайностей, urandom
не будет блокироваться. Если вы используете случайность для криптографических вещей, вы можете избежать urandom
. Для чего-то еще этого должно быть достаточно и, скорее всего, быстрее.
Если вы хотите испортить только биты вашего файла (не весь файл), вы можете просто использовать случайные функции в стиле C. Просто используйте rnd()
, чтобы определить смещение и длину n
, а затем используйте его n
раз, чтобы получить случайные байты, чтобы перезаписать ваш файл.
Следующий скрипт Perl показывает, как это можно сделать (не беспокоясь о компиляции кода C):
use strict;
use warnings;
sub corrupt ($$$$) {
# Get parameters, names should be self-explanatory.
my $filespec = shift;
my $mincount = shift;
my $maxcount = shift;
my $charset = shift;
# Work out position and size of corruption.
my @fstat = stat ($filespec);
my $size = $fstat[7];
my $count = $mincount + int (rand ($maxcount + 1 - $mincount));
my $pos = 0;
if ($count >= $size) {
$count = $size;
} else {
$pos = int (rand ($size - $count));
}
# Output for debugging purposes.
my $last = $pos + $count - 1;
print "'$filespec', $size bytes, corrupting $pos through $last\n";
# Open file, seek to position, corrupt and close.
open (my $fh, "+<$filespec") || die "Can't open $filespec: $!";
seek ($fh, $pos, 0);
while ($count-- > 0) {
my $newval = substr ($charset, int (rand (length ($charset) + 1)), 1);
print $fh $newval;
}
close ($fh);
}
# Test harness.
system ("echo =========="); #DEBUG
system ("cp base-testfile testfile"); #DEBUG
system ("cat testfile"); #DEBUG
system ("echo =========="); #DEBUG
corrupt ("testfile", 8, 16, "ABCDEFGHIJKLMNOPQRSTUVWXYZ ");
system ("echo =========="); #DEBUG
system ("cat testfile"); #DEBUG
system ("echo =========="); #DEBUG
Он состоит из функции corrupt
, которую вы вызываете с именем файла, минимальным и максимальным размером искажения и набором символов для извлечения искажения. Бит внизу - это просто код модульного тестирования. Ниже приведен пример вывода, в котором вы можете увидеть, что часть файла повреждена:
==========
this is a file with nothing in it except for lowercase
letters (and spaces and punctuation and newlines).
that will make it easy to detect corruptions from the
test program since the character range there is from
uppercase a through z.
i have to make it big enough so that the random stuff
will work nicely, which is why i am waffling on a bit.
==========
'testfile', 344 bytes, corrupting 122 through 135
==========
this is a file with nothing in it except for lowercase
letters (and spaces and punctuation and newlines).
that will make iFHCGZF VJ GZDYct corruptions from the
test program since the character range there is from
uppercase a through z.
i have to make it big enough so that the random stuff
will work nicely, which is why i am waffling on a bit.
==========
Он протестирован на базовом уровне, но вы можете обнаружить, что существуют крайние случаи ошибок, о которых необходимо позаботиться. Делай с этим что хочешь.