/ dev / urandomからN個のランダムな文字を読み込む方法は?


50
read /dev/urandom 3

上記は機能していません..bashでランダムバイトを読み取るにはどうすればよい/dev/urandomですか?

回答:


44
random="$(dd if=/dev/urandom bs=3 count=1)"

1
@Flimzy、どのように機能し$()ますか?
linux

2
コマンドの出力を変数のように扱います。注:それはバシズムです。bashを使用していない場合は、代わりに ``を使用する必要があります。``はより普遍的ですが、$()は読みやすいと思います。
Flimzy

@Flimzy、It treats the output of a command like a variable.あなたは実際に文字列としての意味ですか?
linux

2
変数文字列...または数値です。それを変数として扱います...そしてコンテキストに応じて、文字列または数字のように扱われます。
Flimzy

1
$()bash固有ではなく、かなり普遍的です。ところで、シェルが変数に格納できる文字の制限に直面しないように注意してください-たとえば、テストしたbashのバージョンでは、文字列からnull(\ x00)が除外されます。
ゴードンデイヴィソン

45
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(リテラルダッシュ文字が必要な場合、ダッシュ文字は、上記のように、文字列の最後に配置する必要があります*-_)。

そして、上記の一連のコマンドにより何が行われるかを説明するには:

  1. head -c 500 /dev/urandom:から最初の500文字(バイト)を取得します/dev/urandom
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-':最初のコマンドの出力から、指定された文字を除くすべてを削除します'a-zA-Z0-9~!@#$%^&*_-'
  3. fold -w 3:2行目のコマンドが3文字になるように、2番目のコマンドの出力をフォーマットします。
  4. head -n 1:3番目のコマンドの結果の最初の行を表示しstdoutます。

1
彼は... 3つのバイトを探している
クリス・S

1
3プラス正確なパターン
ADM

これは素晴らしいです。
ダニエル・ジェームズW 14年

3
すばらしいです!また、tr funcで使用できる文字クラス名([:graph | print | etc:])もあり、最後に改行文字が必要ない場合は、fold -w 3 | head -n 1aに置き換えることでさらに簡略化できますhead -c 3
Zimmi

5
システムのデフォルトのエンコーディングがマルチバイト(UTF-8など)の場合、trはIllegal byte sequenceエラーで失敗します。これを修正するには、「C」エンコーディングを使用します。コマンドを次のように変更しますhead -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
。– devstuff

33

を確認してくださいman od

使用できます

od -vAn -N4 -tu4 < /dev/urandom

符号なし10進4バイト乱数を生成します。


1
Ekrem、SFへようこそ。私は通常、長く受け入れられた質問に対する新しい答えをあまり支持しませんが、これは以前のすべての答えとはまったく異なり、いくつかの本当の利点があります-素晴らしい!私から+1をお願いします。SFに滞在して、しばらくこのように貢献してください。
MadHatter

19

base64文字列を作成するものを次に示します。base64文字列に制限されているにもかかわらず、パディングが削除されているため、デコードできません。おそらく必要ないでしょう。

 cat /dev/urandom | base64 | head -c 5

5必要な文字数に置き換えます。

ただし、何らかの理由でデコードする必要がある場合base64は、パイプの最後に移動してください。その後、urandomから5文字を収集し、適切なパディングでbase64エンコードしますが、パディングのために最終的な文字列が必要な長さより長くなる場合があります。

cat /dev/urandom | head -c 5 | base64

これは、質問がまさに求めていたものではありません。あなたの答えはまだ役に立つかもしれませんが、質問には確かに言うのに十分な文脈がありません。
カスペルド

1
@kasperd質問は(タイトルで)/ dev / urandomからN個のランダムな文字を読み取る方法を要求しますが、本文ではバイトの読み取りを要求します。矛盾があることに同意します。私は文字を読むためにGoogleからこの質問に来ました、そして、それはオプションとして将来の訪問者を助けるかもしれないと思います。
UmurKontacı15年

あなたの答えは、最もシンプルでありながら理解しやすいと思います。ありがとう!
ロバート

1
を使用catすると、指定された量を超えるN文字が読み取られ、エントロピーが枯渇する可能性があります。役に立たない答え。
ベコ博士

1
博士ベコはこれが乱用されていることが正しいですがcat、両方以来base64head引数としてファイル名を取ることができ、この場合にはそれが動作し、エントロピーを枯渇べきではありません。stackoverflow.com/questions/10031344/を


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.