Domanda Esiste un comando per scrivere byte di spazzatura casuali in un file?


Ora sto facendo alcuni test della mia applicazione di nuovo file corrotti. Ma ho trovato che è difficile trovare i file di test.

Quindi mi chiedo se ci sono alcuni strumenti esistenti, che possono scrivere byte casuali / inutili in un file di qualche formato.

Fondamentalmente, ho bisogno di questo strumento per:

  1. Scrive byte immondizia casuali nel file.
  2. Non ha bisogno di conoscere il formato del file, solo la scrittura di byte casuali è OK per me.
  3. È meglio scrivere in posizioni casuali del file di destinazione.
  4. Anche l'elaborazione in batch è un bonus.

Grazie.


44
2017-08-30 07:32


origine


risposte:


Il /dev/urandom pseudo-dispositivo, insieme a dd, puoi farlo per te:

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

Questo creerà un file newfile di dimensione 10M.

Il /dev/random il dispositivo si bloccherà spesso se non si accumula una casualità sufficiente, urandom non bloccherà. Se stai usando la casualità per roba di crittografia, puoi stare alla larga urandom. Per qualsiasi altra cosa, dovrebbe essere sufficiente e molto probabilmente più veloce.

Se vuoi corrompere solo i bit del tuo file (non l'intero file), puoi semplicemente usare le funzioni casuali in stile C. Basta usare rnd() per capire un offset e la lunghezza n, quindi usalo n volte per afferrare byte casuali per sovrascrivere il tuo file con.


Il seguente script Perl mostra come ciò può essere fatto (senza doversi preoccupare di compilare il codice 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

Consiste del corrupt funzione che chiami con un nome di file, dimensioni minime e massime di corruzione e un set di caratteri per disegnare il danneggiamento. Il bit in fondo è solo codice di test unitario. Di seguito è riportato un esempio di output in cui è possibile vedere che una sezione del file è stata danneggiata:

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

È testato a un livello base, ma è possibile che ci siano casi di errori marginali che devono essere risolti. Fanne ciò che vuoi.


79
2017-08-30 07:36



Solo per completezza, ecco un altro modo per farlo:

shred -s 10 - > my-file

Scrive 10 byte casuali per lo stdout e lo reindirizza a un file. shred viene solitamente utilizzato per distruggere (sovrascrivere in modo sicuro) i dati, ma può essere utilizzato anche per creare nuovi file casuali. Quindi se hai già un file che vuoi riempire con dati casuali, usa questo:

shred my-existing-file

20
2017-08-30 07:56



Si può leggere da /dev/random:

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

È possibile specificare la dimensione anche in un modo leggibile dall'uomo:

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

6
2017-08-30 07:36