Ответ 1
Псевдо-устройство /dev/urandom
вместе с dd
может сделать это для вас:
dd if=/dev/urandom of=newfile bs=1M count=10
Это создаст файл newfile
размером 10M.
Устройство /dev/random
часто блокируется, если не создается достаточная хаотичность, urandom
не будет блокироваться. Если вы используете случайность для вещей крипто-класса, вы можете избегать urandom
. Для чего-то еще, это должно быть достаточно и, скорее всего, быстрее.
Если вы хотите испортить только биты вашего файла (не весь файл), вы можете просто использовать случайные функции C-стиля. Просто используйте rnd()
для вычисления смещения и длины n
, затем используйте его n
раз, чтобы захватить случайные байты, чтобы перезаписать файл.
Следующий Perl script показывает, как это можно сделать (не беспокоясь о компиляции кода 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.
==========
Он протестирован на базовом уровне, но вы можете обнаружить, что есть случаи ошибок в крае, о которых нужно позаботиться. Поступай с этим, что хочешь.