Подтвердить что ты не робот

Есть ли команда для записи случайных байтов мусора в файл?

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

Так что мне интересно, есть ли какие-то существующие инструменты, которые могут записывать случайные/мусорные байты в файл некоторого формата.

В принципе, мне нужен этот инструмент для:

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

Спасибо.

4b9b3361

Ответ 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.
==========

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

Ответ 2

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

shred -s 10 - > my-file

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

shred my-existing-file

Ответ 3

Вы можете читать из /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