ddランダム

ddコマンドでランダムなバイナリを作ってみます。

その他のLinux関連記事はコチラ
中級者のためのLinuxコマンド入門

カーネル乱数ソースデバイス(/dev/urandom)を使い、ddでフィルタリングしてバイナリ生成します。

takk@deb9:~/tmp$ cat /dev/urandom | od -tx1 | head
0000000 a3 22 33 24 f9 7d a7 ee 33 8e 57 a8 4c 99 8c 9a
0000020 b2 0e 1a e8 2d bc e4 ad 29 e9 d0 c0 d3 15 f0 99
0000040 c5 ac 26 12 2f 57 02 3e 70 95 dd d2 db 8c 21 d7
0000060 89 e7 31 85 44 aa 11 d9 41 13 db 22 ec 2d 6b 96
0000100 59 72 5d 24 36 25 6d 60 4d 32 ae 4e 37 fd d4 d2
0000120 11 61 05 03 36 a2 29 43 ad fe 94 3c 5d 2d c6 24
0000140 4c 73 36 8b b8 80 fd d7 db 57 59 50 52 83 d5 36
0000160 f2 d0 e6 37 bd 54 11 f5 ab 63 36 b5 c4 f5 d8 e1
0000200 a6 77 5f d1 bf b1 d2 5b 54 4d 63 0a 98 57 03 d0
0000220 9a 1a b4 a8 66 e4 b7 af 1e 34 4f 6e b8 0d e6 e1
takk@deb9:~/tmp$ 

ファイルa.binに512 Byte書き込んでみましょう。

takk@deb9:~/tmp$ cat /dev/urandom | dd count=1 > a.bin
1+0 レコード入力
1+0 レコード出力
512 bytes copied, 0.00111485 s, 459 kB/s
takk@deb9:~/tmp$ 

countだけ指定して、bsを指定しないとデフォルトのBlock Size=512 Byteになります。

ダンプして確認。

takk@deb9:~/tmp$ od -tx1 -Ax a.bin
000000 04 aa b4 75 fe 0a f7 4b 8a 14 d4 39 eb 38 5c aa
000010 f7 63 f0 35 ab 76 0f 7f 90 5a 29 16 52 de ea 32
000020 13 12 f7 09 7e 72 3f ec fc 2a 0f b5 8c 9a d9 e0
000030 95 f2 9d e4 3e ea 81 74 b5 c4 b0 75 e0 36 b4 d2


省略


0001d0 33 1c a5 fc f5 87 e9 57 0d b0 50 9f 81 12 35 b1
0001e0 22 ca a8 21 0d 47 01 8c 76 45 49 8e d8 50 03 b7
0001f0 02 f1 2b 0f 11 5f 9c 27 52 8c c6 a0 dc ae 34 1a
000200
takk@deb9:~/tmp$ 

10 Byteだけランダム値を取得してa.binファイル生成

takk@deb9:~/tmp$ cat /dev/urandom | dd bs=10 count=1 > a.bin
1+0 レコード入力
1+0 レコード出力
10 bytes copied, 0.0011584 s, 8.6 kB/s
takk@deb9:~/tmp$ od -tx1 -Ax a.bin
000000 83 15 26 98 68 e8 a4 1c f1 43
00000a
takk@deb9:~/tmp$ 

なんだか面倒くさいです。しかも乱数の範囲が指定できないので使い勝手も悪い。
無理やりdd使ってるからしょうがないですが。スピードが必要ないなら、手軽にスクリプトでいいですね。Perlで0~4の数値で10 Byteのb.binファイルを生成してみます。

takk@deb9:~/tmp$ seq 10 | perl -ne 'print int rand 5' > b.bin
takk@deb9:~/tmp$ od -tx1 -Ax b.bin
000000 32 33 34 31 30 32 31 31 32 33
00000a
takk@deb9:~/tmp$ 

あ、間違えました。数字の0から4、つまり0x30~0x34になってしまいました。
chrを挟んでバイナリ化。

takk@deb9:~/tmp$ seq 10 | perl -ne'print chr int rand 5' > b.bin
takk@deb9:~/tmp$ od -tx1 -Ax b.bin
000000 00 04 04 04 04 01 01 04 01 02
00000a
takk@deb9:~/tmp$

ddはファイルコピーするコマンドなので、変換には向かないかもしれませんが、ddって入力しやすくて覚えやすいので、何だか使わないともったいない気がするんですよね。
フィルタリングする機能がもう少し充実してたらなあと思う今日この頃。

コメント

タイトルとURLをコピーしました