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

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

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

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

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

Спасибо.

53
задан Fan 29 August 2010 в 20:32
поделиться

3 ответа

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

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

93
ответ дан 7 November 2019 в 08:29
поделиться

Вы можете прочитать из /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
6
ответ дан 7 November 2019 в 08:29
поделиться

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

shred -s 10 - > my-file

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

shred my-existing-file
25
ответ дан 7 November 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: