web-dev-qa-db-ja.com

ランダムなゴミバイトをファイルに書き込むコマンドはありますか?

現在、アプリケーションが破損したファイルを再度テストしています。しかし、テストファイルを見つけるのは難しいことがわかりました。

だから私は、ランダム/ガーベッジバイトを何らかの形式のファイルに書き込むことができる既存のツールがあるかどうか疑問に思っています。

基本的に、このツールは次の目的で必要です。

  1. ランダムなガベージバイトをファイルに書き込みます。
  2. ファイルの形式を知る必要はなく、ランダムなバイトを書き込むだけで問題ありません。
  3. ターゲットファイルのランダムな位置に書き込むのが最適です。
  4. バッチ処理もボーナスです。

ありがとう。

52
Fan

_/dev/urandom_擬似デバイスとddを使用して、これを行うことができます。

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

これにより、サイズが10Mのファイルnewfileが作成されます。

_/dev/random_デバイスは、十分なランダム性が構築されていない場合にブロックすることが多く、urandomはブロックしません。暗号グレードのものにランダム性を使用している場合、urandomを避けることができます。それ以外の場合は、それで十分であり、ほとんどの場合高速です。

ファイル全体ではなくファイルのほんの一部を破損したい場合は、Cスタイルのランダム関数を使用するだけです。 rnd()を使用してオフセットと長さnを計算し、n回使用してランダムなバイトを取得してファイルを上書きします。


次のPerlスクリプトは、これを行う方法を示しています(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
_

これは、ファイル名、最小および最大破損サイズ、および破損の原因となる文字セットで呼び出すcorrupt関数で構成されます。一番下のビットは、単体テストコードです。以下は、ファイルのセクションが破損していることを確認できるサンプル出力です。

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

基本レベルでテストされていますが、注意が必要なEdgeエラーのケースがあるかもしれません。あなたがすることでそれでやりなさい。

92
paxdiablo

完全を期すために、これを行う別の方法を次に示します。

shred -s 10 - > my-file

ランダムな10バイトをstdoutに書き込み、ファイルにリダイレクトします。 shredは通常、データを破壊(安全に上書き)するために使用されますが、新しいランダムファイルを作成するためにも使用できます。そのため、ランダムデータで埋めたいファイルが既にある場合は、これを使用します。

shred my-existing-file
25
jkramer

/dev/randomから読み取ることができます。

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

サイズは人間が読める方法でも指定できます。

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