現在、アプリケーションが破損したファイルを再度テストしています。しかし、テストファイルを見つけるのは難しいことがわかりました。
だから私は、ランダム/ガーベッジバイトを何らかの形式のファイルに書き込むことができる既存のツールがあるかどうか疑問に思っています。
基本的に、このツールは次の目的で必要です。
ありがとう。
_/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エラーのケースがあるかもしれません。あなたがすることでそれでやりなさい。
完全を期すために、これを行う別の方法を次に示します。
shred -s 10 - > my-file
ランダムな10バイトをstdoutに書き込み、ファイルにリダイレクトします。 shred
は通常、データを破壊(安全に上書き)するために使用されますが、新しいランダムファイルを作成するためにも使用できます。そのため、ランダムデータで埋めたいファイルが既にある場合は、これを使用します。
shred my-existing-file
/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