2010-08-30 4 views
41

Ich mache jetzt einige Tests meiner Anwendung erneut beschädigte Dateien. Aber ich fand es schwierig, Testdateien zu finden.Gibt es einen Befehl, um zufällige Müll-Bytes in eine Datei zu schreiben?

Also ich frage mich, ob es einige vorhandene Tools gibt, die zufällige/Müll Bytes in eine Datei eines Formats schreiben können.

Grundsätzlich muß ich dieses Tool:

  1. Es schreibt zufälligen Müll Bytes in die Datei.
  2. Es muss nicht das Format der Datei wissen, nur zufällige Bytes schreiben sind OK für mich.
  3. Es ist am besten, an zufällige Positionen der Zieldatei zu schreiben.
  4. Stapelverarbeitung ist auch ein Bonus.

Danke.

Antwort

75

Die /dev/urandom pseudo-Gerät, zusammen mit dd, kann dies für Sie tun:

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

Dies wird eine Datei newfile von Größe 10M erstellen.

Das Gerät /dev/random blockiert häufig, wenn keine ausreichende Zufälligkeit vorhanden ist, urandom wird nicht blockiert. Wenn Sie die Zufälligkeit für Krypto-Zeug verwenden, können Sie sich von urandom fernhalten. Für alles andere sollte es ausreichend und wahrscheinlich schneller sein.

Wenn Sie möchten, zu korrumpieren nur Bits der Datei (nicht die gesamte Datei), können Sie einfach die C-Stil Zufallsfunktionen verwenden. Verwenden Sie einfach rnd() eine Offset und Länge n, um herauszufinden, dann verwenden Sie es n mal zufällige Bytes packen Sie Ihre Datei mit zu überschreiben.


Der folgende Perl-Skript zeigt, wie diese (ohne C-Code zu kümmern über das Kompilieren) getan werden kann:

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 

Es besteht aus der corrupt Funktion, Sie rufen mit einem Dateinamen, minimaler und maximaler Korruptionsgröße und einem Zeichensatz auf, um die Korruption zu zeichnen. Das Bit an der Unterseite ist nur Unit-Test-Code. Nachfolgend finden Sie einige Beispielausgabe, wo Sie, dass ein Abschnitt der Datei beschädigt ist, sehen kann:

auf einer grundlegenden Ebene
========== 
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. 
========== 

Es getestet, aber man kann es Pflege finden Kantenfehlerfälle sind, die getroffen werden müssen. Mach damit was du willst.

+0

+1 Correct - obwohl man den Unterschied zwischen zufälligen und urandom erklären könnten wollen ... – Konerak

+0

Eigentlich hatte ich zu verwenden 10M für die dd arg 'bs' – Benoit

+0

'urandom' ist nicht so schnell, wie ich möchte. "urandom" generiert Sequenzen, die gut genug sind, um private Schlüssel zu erstellen. Ich brauche solche Garantien nicht, aber ich will mehr Geschwindigkeit. – akostadinov

5

Sie von /dev/random lesen konnte:

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

Sie können die Größe auch in einer für Menschen lesbaren Art und Weise angeben:

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

Ich denke, das ist die beste Antwort, weil die Frage mit "linux" getaggt ist. Auf einem anderen Unix kann/dev/urandom jedoch so dokumentiert werden: "/ dev/urandom ist eine Kompatibilitätsnotation zu Linux. Auf Linux produziert/dev/urandom eine niedrigere Qualität, wenn der Entropie-Pool leer ist, während/dev/random lieber blockieren und darauf warten, dass zusätzliche Entropie gesammelt wird. Mit Yarrow ist diese Wahl und Unterscheidung nicht notwendig, und die beiden Geräte verhalten sich identisch. Sie können beides verwenden. " –

+2

'/ dev/random' ist zu langsam. Nicht was der Autor wollte. -1 – akostadinov

19

Nur der Vollständigkeit halber, hier ist eine andere Art und Weise, es zu tun:

shred -s 10 - > my-file 

Schreibt 10 zufällige Bytes in stdout und leitet sie in eine Datei um. shred wird normalerweise zum Zerstören (Sicheres Überschreiben) von Daten verwendet, aber es kann auch zum Erstellen neuer zufälliger Dateien verwendet werden. Also, wenn Sie bereits eine Datei, die Sie mit zufälligen Daten füllen möchten, verwenden Sie diese:

shred my-existing-file 
+0

interessant, danke. Ist das schneller als "Urand"? – akostadinov

Verwandte Themen