web-dev-qa-db-ja.com

コマンドラインから32個の16進数のランダムな文字列を取得する方法は?

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などのようなツール。

27
Ana

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つの選択肢は複雑な質問であり、この回答の範囲外です。不明な場合は、 この他の質問 をご覧ください。

53
Renaud Pacalet

私が知っている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つをコメント化します。

15
user2350426

単一のコマンドを探していて、opensslがインストールされている場合は、以下を参照してください。ランダムな16バイト(32個の16進数記号)を生成し、16進数でエンコードします(-base64もサポートされます)。

openssl Rand -hex 16
11
touzoku

以下にいくつかのオプションを示します。すべてのオプションには、出力文字列の長さを直接選択する明白で簡単な方法を提供する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

編集:異なるシェルでテスト済み。

6
caveman