32桁の16進数の文字列を出力するコマンドをまとめたいと思います。私はPython動作するスクリプトを持っています:
python -c 'import random ; print "".join(map(lambda t: format(t, "02X"), [random.randrange(256) for x in range(16)]))'
これにより、次のような出力が生成されます。
6EF6B30F9E557F948C402C89002C7C8A
それが私が必要なものです。
Macでは、これを行うことさえできます。
uuidgen | tr -d '-'
しかし、私はより洗練されたスクリプト言語Rubyおよびpythonにアクセスできず、Macにはいません(したがってuuidgenはありません)。bashに固執する必要があります。私は限られたプラットフォームにいるので、sed、awk、/ dev/randomなどのようなツール。
hexdump
がある場合:
hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
仕事をする必要があります。
説明:
-n 16
は、16バイトの入力を消費します(32桁の16進数= 16バイト)。4/4 "%08X"
は、4回反復し、反復ごとに4バイトを消費し、対応する32ビット値を8桁の16進数として出力します(必要に応じて先行ゼロ付き)。1 "\n"
は単一の改行で終わります。注:このソリューションでは/dev/random
を使用していますが、/dev/urandom
も使用できます。 2つの選択肢は複雑な質問であり、この回答の範囲外です。不明な場合は、 この他の質問 をご覧ください。
私が知っている3つの方法があります:
#!/bin/bash
n=16
# Read n bytes from urandom (in hex):
xxd -l "$n" -p /dev/urandom | tr -d " \n" ; echo
od -vN "$n" -An -tx1 /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e ' /1 "%02x"' /dev/urandom ; echo
1つを使用し、他の2つをコメント化します。
単一のコマンドを探していて、opensslがインストールされている場合は、以下を参照してください。ランダムな16バイト(32個の16進数記号)を生成し、16進数でエンコードします(-base64もサポートされます)。
openssl Rand -hex 16
以下にいくつかのオプションを示します。すべてのオプションには、出力文字列の長さを直接選択する明白で簡単な方法を提供するNiceプロパティがあります。以下のすべてのケースで、「32」を目的の文字列の長さに変更するだけで十分です。
#works in bash and busybox, but not in ksh
tr -dc 'A-F0-9' < /dev/urandom | head -c32
#works in bash and ksh, but not in busybox
tr -dc 'A-F0-9' < /dev/urandom | dd status=none bs=1 count=32
#works in bash, ksh, AND busybox! w00t!
tr -dc 'A-F0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null
編集:異なるシェルでテスト済み。