web-dev-qa-db-fra.com

Existe-t-il une commande pour écrire des octets d'ordures aléatoires dans un fichier?

Je fais maintenant quelques tests de mon application à nouveau des fichiers corrompus. Mais j'ai trouvé qu'il était difficile de trouver des fichiers de test.

Je me demande donc s'il existe des outils existants, qui peuvent écrire des octets aléatoires/ordures dans un fichier d'un certain format.

Fondamentalement, j'ai besoin de cet outil pour:

  1. Il écrit des octets d'ordures aléatoires dans le fichier.
  2. Il n'a pas besoin de connaître le format du fichier, il suffit pour moi d'écrire des octets aléatoires.
  3. Il est préférable d'écrire à des positions aléatoires du fichier cible.
  4. Le traitement par lots est également un bonus.

Merci.

52
Fan

Le pseudo-périphérique /dev/urandom, Avec dd, peut faire ceci pour vous:

dd if=/dev/urandom of=newfile bs=1M count=10

Cela créera un fichier newfile de taille 10M.

Le périphérique /dev/random Se bloquera souvent s'il n'y a pas suffisamment d'aléatoire construit, urandom ne se bloquera pas. Si vous utilisez le caractère aléatoire pour des trucs de qualité cryptographique, vous pouvez éviter urandom. Pour toute autre chose, cela devrait être suffisant et probablement plus rapide.

Si vous voulez corrompre seulement des morceaux de votre fichier (pas le fichier entier), vous pouvez simplement utiliser les fonctions aléatoires de style C. Utilisez simplement rnd() pour déterminer un décalage et une longueur n, puis utilisez-le n fois pour saisir des octets aléatoires afin d'écraser votre fichier.


Le script Perl suivant montre comment cela peut être fait (sans avoir à se soucier de la compilation du code 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

Il se compose de la fonction corrupt que vous appelez avec un nom de fichier, une taille de corruption minimale et maximale et un jeu de caractères pour en tirer la corruption. Le bit en bas est juste un code de test unitaire. Vous trouverez ci-dessous un exemple de sortie où vous pouvez voir qu'une section du fichier a été corrompue:

==========
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.
==========

Il est testé à un niveau de base, mais vous pouvez constater qu'il existe des cas d'erreur Edge qui doivent être pris en charge. Faites-en ce que vous voulez.

92
paxdiablo

Juste pour être complet, voici une autre façon de le faire:

shred -s 10 - > my-file

Écrit 10 octets aléatoires dans stdout et le redirige vers un fichier. shred est généralement utilisé pour détruire (écraser en toute sécurité) les données, mais il peut également être utilisé pour créer de nouveaux fichiers aléatoires. Donc, si vous avez déjà un fichier que vous souhaitez remplir avec des données aléatoires, utilisez ceci:

shred my-existing-file
25
jkramer

Vous pouvez lire à partir de /dev/random:

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

Vous pouvez également spécifier la taille de manière lisible par l'homme:

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