Czy istnieje polecenie do zapisu losowych bajtów śmieci do pliku?

Robię teraz kilka testów mojej aplikacji ponownie uszkodzonych plików. Ale okazało się, że trudno jest znaleźć pliki testowe.

Zastanawiam się więc, czy istnieją jakieś istniejące narzędzia, które mogą zapisywać losowe / śmieciowe bajty do pliku o jakimś formacie.

W zasadzie potrzebuję tego narzędzia do:

  1. zapisuje losowe bajty śmieci do pliku.
  2. nie musi znać formatu pliku, tylko pisanie losowych bajtów jest dla mnie OK.
  3. najlepiej pisać losowo pozycji pliku docelowego.
  4. przetwarzanie wsadowe to również bonus.
Dzięki.
Author: Fan, 2010-08-30

3 answers

Pseudo-urządzenie, wraz z dd, może to zrobić za ciebie:

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

Spowoduje to utworzenie pliku newfile o rozmiarze 10M.

/dev/random urządzenie często blokuje, jeśli nie ma wystarczającej losowości, urandom nie blokuje. Jeśli używasz losowości do kryptowalut, możesz omijać urandom. W przypadku czegokolwiek innego powinno to być wystarczające i najprawdopodobniej szybsze.

Jeśli chcesz uszkodzić tylko fragmenty pliku (nie cały plik), możesz po prostu użyj funkcji losowych w stylu C. Po prostu użyj rnd(), aby obliczyć przesunięcie i długość n, a następnie użyj go n razy, aby pobrać losowe bajty, aby nadpisać plik.


Poniższy skrypt Perla pokazuje, jak można to zrobić (bez martwienia się o kompilowanie kodu 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

Składa się z funkcji corrupt, którą wywołujesz z nazwą pliku, minimalnym i maksymalnym rozmiarem uszkodzeń oraz zestawem znaków, z których można je wyciągnąć. Na bit na dole to po prostu kod do testów jednostkowych. Poniżej znajduje się Przykładowe wyjście, na którym widać, że część pliku została uszkodzona:

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

Jest testowany na poziomie podstawowym, ale może się okazać, że istnieją przypadki błędów krawędzi, które należy rozwiązać. Zrób z tym, co chcesz.

 83
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 14:14:35

Tylko dla kompletności, oto inny sposób, aby to zrobić:

shred -s 10 - > my-file

Zapisuje 10 losowych bajtów na standardowe wyjście i przekierowuje je do pliku. shred jest zwykle używany do niszczenia (bezpiecznego nadpisywania) danych, ale może być również używany do tworzenia nowych losowych plików. Jeśli więc masz już plik, który chcesz wypełnić losowymi danymi, użyj tego:

shred my-existing-file
 20
Author: jkramer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 07:56:09

Możesz przeczytać z /dev/random:

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

Możesz określić rozmiar również w sposób czytelny dla człowieka:

# generate just 2MB ...
dd if=/dev/random of=random.stuff bs=1M count=2
 6
Author: miku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 07:41:19