回答:
random="$(dd if=/dev/urandom bs=3 count=1)"
It treats the output of a command like a variable.
あなたは実際に文字列としての意味ですか?
$()
bash固有ではなく、かなり普遍的です。ところで、シェルが変数に格納できる文字の制限に直面しないように注意してください-たとえば、テストしたbashのバージョンでは、文字列からnull(\ x00)が除外されます。
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
(リテラルダッシュ文字が必要な場合、ダッシュ文字は、上記のように、文字列の最後に配置する必要があります*-_
)。
そして、上記の一連のコマンドにより何が行われるかを説明するには:
head -c 500 /dev/urandom
:から最初の500文字(バイト)を取得します/dev/urandom
。tr -dc 'a-zA-Z0-9~!@#$%^&*_-'
:最初のコマンドの出力から、指定された文字を除くすべてを削除します'a-zA-Z0-9~!@#$%^&*_-'
。fold -w 3
:2行目のコマンドが3文字になるように、2番目のコマンドの出力をフォーマットします。 head -n 1
:3番目のコマンドの結果の最初の行を表示しstdout
ます。fold -w 3 | head -n 1
aに置き換えることでさらに簡略化できますhead -c 3
。
Illegal byte sequence
エラーで失敗します。これを修正するには、「C」エンコーディングを使用します。コマンドを次のように変更しますhead -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
base64文字列を作成するものを次に示します。base64文字列に制限されているにもかかわらず、パディングが削除されているため、デコードできません。おそらく必要ないでしょう。
cat /dev/urandom | base64 | head -c 5
5
必要な文字数に置き換えます。
ただし、何らかの理由でデコードする必要がある場合base64
は、パイプの最後に移動してください。その後、urandomから5文字を収集し、適切なパディングでbase64エンコードしますが、パディングのために最終的な文字列が必要な長さより長くなる場合があります。
cat /dev/urandom | head -c 5 | base64
cat
すると、指定された量を超えるN
文字が読み取られ、エントロピーが枯渇する可能性があります。役に立たない答え。
cat
、両方以来base64
とhead
引数としてファイル名を取ることができ、この場合にはそれが動作し、エントロピーを枯渇べきではありません。stackoverflow.com/questions/10031344/を
これを試して: dd if=/dev/urandom bs=1 count=3
結果を$ variableに入れたい場合:
variable=`dd if=/dev/urandom bs=1 count=3`
おそらく印刷できないことに注意してください。
最も簡単な解決策は次のように簡単です:
$ head -cN /dev/urandom
$()
ますか?