Есть ли команда для записи случайных байтов мусора в файл? - PullRequest
52 голосов
/ 30 августа 2010

Я сейчас делаю несколько тестов моего приложения, снова поврежденные файлы.Но я обнаружил, что трудно найти тестовые файлы.

Поэтому мне интересно, существуют ли какие-либо инструменты, которые могут записывать случайные / мусорные байты в файл какого-либо формата.Мне нужен этот инструмент для:

  1. Он записывает случайные байты мусора в файл.
  2. Ему не нужно знать формат файла, достаточно просто записать случайные байты дляme.
  3. Лучше всего писать в произвольных местах целевого файла.
  4. Пакетная обработка также является бонусом.

Спасибо.

Ответы [ 3 ]

91 голосов
/ 30 августа 2010

Псевдо-устройство /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.
==========

Он протестирован на базовом уровне, но вы можете обнаружить, что существуют крайние случаи ошибок, о которых необходимо позаботиться. Делай с этим что хочешь.

23 голосов
/ 30 августа 2010

Просто для полноты, вот еще один способ сделать это:

shred -s 10 - > my-file

Записывает 10 случайных байтов в стандартный вывод и перенаправляет его в файл. shred обычно используется для уничтожения (безопасной перезаписи) данных, но также может использоваться для создания новых случайных файлов. Поэтому, если у вас уже есть файл, который вы хотите заполнить случайными данными, используйте это:

shred my-existing-file
6 голосов
/ 30 августа 2010

Вы могли читать с /dev/random:

# generate a 50MB file named `random.stuff` filled with random stuff ...
dd if=/dev/random of=random.stuff bs=1000000 count=50

Вы также можете указать размер в удобочитаемой форме:

# generate just 2MB ...
dd if=/dev/random of=random.stuff bs=1M count=2
...