2010-08-30 18 views
41

Ahora estoy haciendo algunas pruebas de mi aplicación nuevamente archivos dañados. Pero encontré que es difícil encontrar archivos de prueba.¿Existe un comando para escribir bytes de basura al azar en un archivo?

Así que me pregunto si hay algunas herramientas existentes, que pueden escribir bytes aleatorios/basura en un archivo de algún formato.

Básicamente, necesito esta herramienta para:

  1. Se escribe bytes de basura al azar en el archivo.
  2. No necesita saber el formato del archivo, simplemente escribir bytes aleatorios está bien para mí.
  3. Lo mejor es escribir en posiciones aleatorias del archivo de destino.
  4. El procesamiento por lotes también es una ventaja.

Gracias.

Respuesta

75

El pseudo-dispositivo /dev/urandom, junto con dd, puede hacer esto para usted:

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

Esto creará un archivo de tamaño newfile 10M.

El dispositivo /dev/random a menudo bloqueará si no hay suficiente aleatoriedad acumulada, urandom no se bloqueará. Si está utilizando la aleatoriedad para material criptográfico, puede alejarse de urandom. Para cualquier otra cosa, debería ser suficiente y muy probablemente más rápido.

Si quiere corromper solo algunos bits de su archivo (no el archivo completo), puede simplemente usar las funciones aleatorias de estilo C. Simplemente use rnd() para calcular un desplazamiento y longitud n, luego úselo n veces para tomar bytes aleatorios para sobrescribir su archivo.


El siguiente script Perl muestra cómo se puede hacer esto (y sin tener que preocuparse de compilar código 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 en la función corrupt que llama con un nombre de archivo, tamaño mínimo y máximo de corrupción y un conjunto de caracteres para extraer la corrupción. El bit en la parte inferior es solo un código de prueba de unidad. A continuación se muestra un ejemplo de salida, donde se puede ver que una sección del archivo se ha corrompido:

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

Está probado en un nivel básico pero puede encontrar que hay casos de error de borde que necesitan ser atendidos. Haz con él lo que quieras.

+0

+1 correcta - aunque es posible que desee para explicar la diferencia entre el azar y urandom ... – Konerak

+0

en realidad tenía usar 10M para dd arg 'bs' – Benoit

+0

'urandom' no es tan rápido como me gustaría. 'urandom' genera secuencias lo suficientemente buenas para crear claves privadas. No necesito esas garantías pero quiero más velocidad. – akostadinov

5

Se podía leer desde /dev/random:

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

Puede especificar el tamaño también en una forma legible por humanos:

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

Creo que esta es la mejor respuesta porque la pregunta está etiquetada como "linux". Sin embargo, en otro Unix,/dev/urandom puede documentarse así: "/ dev/urandom es un guiño de compatibilidad para Linux. En Linux,/dev/urandom producirá un resultado de menor calidad si el conjunto de entropía se drena, mientras que/dev/random will prefieren bloquear y esperar a que se recopile entropía adicional. Con Yarrow, esta elección y distinción no es necesaria, y los dos dispositivos se comportan de manera idéntica. Puede usar cualquiera de ellos ". –

+2

'/ dev/random' es demasiado lento. No es lo que el autor quería. -1 – akostadinov

19

simplemente para la corrección, aquí hay otra manera de hacerlo:

shred -s 10 - > my-file 

Escribe 10 bytes aleatorios para stdout y lo redirige a un archivo. shred se usa generalmente para destruir datos (sobrescribir de forma segura), pero también se puede usar para crear nuevos archivos aleatorios. Así que si ya ha tener un archivo que desea rellenar con datos aleatorios, utilice esto:

shred my-existing-file 
+0

interesante, gracias. ¿Es esto más rápido que 'urandom'? – akostadinov

Cuestiones relacionadas