回答:
現在、GNU trはシングルバイト文字のみを完全にサポートしています。したがって、マルチバイトエンコーディングを使用するロケールでは、出力がおかしくなる可能性があります。
$ </dev/urandom LC_ALL=vi_VN.tcvn tr -dc '[:print:]' | head -c 64
`�pv���Z����c�ox"�O���%�YR��F�>��췔��ovȪ������^,<H ���>
シェルはマルチバイト文字を正しく印刷しますが、GNU tr
は印刷不可能と思われるバイトを削除します。
安定させるには、ロケールを設定する必要があります。
$ </dev/urandom LC_ALL=C tr -dc '[:print:]' | head -c 64
RSmuiFH+537z+iY4ySz`{Pv6mJg::RB;/-2^{QnKkImpGuMSq92D(6N8QF?Y9Co@
:graph:
代わりに:print:
:</dev/urandom LC_ALL=C tr -dc '[:graph:]' | head -c 64
代わりに検討してください
$ dd if=/dev/urandom bs=48 count=1 status=none | base64
imW/X60Sk9TQzl+mdS5PL7sfMy9k/qFBWWkzZjbYJttREsYpzIguWr/uRIhyisR7
これには2つの利点があります。
ランダムデバイスから読み取るのは48 KBのみであり、8 KB以下です。同じホスト上の他のプロセスが乱数を必要とする場合、8KBが一度に消費されることが深刻な問題になる可能性があります。(はい、おそらく誰もブロッキングランダムデバイスを使用すべきではありませんが、人々はそうします。)
の出力にbase64
は、特別な意味を持つ文字はほとんど含まれていません。(まったくない場合| tr +/ -_
は、最後にタックし、(例のように)入力するバイト数base64
が3の倍数であることを確認します。)
このように生成されたパスワードは、エントロピーの正確384ビットあり、多少あなたは何をしていたよりも少ない(ログイン2 96 64 ≈421.4)を、より多くのほとんどの目的(エントロピーの256ビットのための十分よりはときまだ推測」で安全ですRSAキーを除いて、太陽は燃え尽きます」
他の人々は、ロケールが[:print:]
意味を決定することをすでに指摘しています。ただし、すべての印刷可能文字がパスワードに適しているわけではありません(asciiでも)。スペース、タブ、#$%^は本当に必要ないのですか?パスワードに-覚えるのが難しいだけでなく、基礎となる認証システムにとって潜在的に危険である、入力フィールドに入力することができない、などです。この場合、「正気」の文字を手動で選択する必要があります。
LC_ALL=C </dev/urandom tr -dc '[:alnum:]_' | head -c 64
または単に
</dev/urandom tr -dc 'A-Za-z0-9_' | head -c 64
またはbase64
、他の回答で提案されているとおりに使用してください。
?
または^
真剣に考えるにはあまりにも悪い認証システム。
[:print:]
クラスにはタブは含まれません。スペースは[:alnum:]
+ [:punct:]
+ のみです(単一スペースではなく [:space:]
)。
どう?
tr -dc [:print:] < /dev/urandom | head -c 64 | strings
文字列はurandomの出力を印刷可能な形式で印刷する必要があります
-bash: /dev/urandom: Permission denied
/dev/random
パスワードの生成に使用する理由があるかどうかはわかりませんが、痛みを和らげるためにpwgenを使用することをお勧めします。
$ pwgen -s 10 1
ここで、10はパスワードの長さです。
#Chars allowed in password (I don't like l,o,O, etc):
P="0123456789ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz"
#Or such:
#P="a-zA-Z0-9"
head -c 8 < /dev/urandom | tr '\000-\377' "$P$P$P$P$P"
echo
このメソッドは、/ dev / urandomからデータを消費する場合、より賢くなります。$ P $ P $ P ...として貼り付ける文字列は、少なくとも256文字の長さが必要です。