ランダムな文字列がほしい

何かしらのユーザアカウントを払い出すときに仮設定しておくパスワードのように、ランダムな文字列がほしいときに使えるコマンドです。

cat /dev/urandom | tr -dc 'a-zA-Z0-9!?+*' | fold -w 12 | head -n 1

仕組み

パイプでつないでいる各コマンドを詳しく見ていきます。

ぐちゃぐちゃな文字列を取得

cat /dev/urandom

/dev/urandomをcatして、ランダムで長い文字列を取得します。
文字や記号の種類は関係なく、ぐちゃぐちゃなものが大量に出力されます。

この部分だけでの実行はおすすめしません。

#この部分の実行結果例(抜粋)
nh百m?涸`緬條bK斌cb  ='伝鏈隔El・V4    ⅴ;R湲賽^耳宰愁額A鍰漂?3

ものすごくランダムに見えますが、エントロピープールの枯渇(詳しくは分かりません)という問題があるそうで、本当に完全にランダムなのか、には議論の余地があるらしいです。
とはいえ、仮パスワード生成のような用途なら問題ないでしょう。


使いたい文字や記号だけにする

tr -dc 'a-zA-Z0-9!?+*'

文字や記号が何でもかんでも使えるということはないでしょうから、ぐちゃぐちゃ文字列を加工して、使いたいもののみを残し、ほかは削除します。

'a-zA-Z0-9!?+*'の部分が残す文字や記号の指定となっていて、ここを変更することで、最終的なランダム文字列に使われる文字や記号の種類を指定することができます。

#この部分までの実行結果例(抜粋)
zp1ARuZF*fLv9hT?jrCi*pXftB7UOqVh2oQrMK2C0wUP+2IzqLkOEW!UgrlNiWxDVUEK3FDGTgVfHoMpKOzw5hutz3Y2vAcJpZqLiCQy


ほしい文字数を指定

fold -w 12

使いたい文字や記号のみに絞った段階では、文字列は非常に長い1行になっています。そこで、foldで文字列を折り返させます。

ここで指定する折り返し文字数が、最終的なランダム文字列の文字数になります。

この段階で、いい具合のランダム文字列ができていますが、大量に出力されてしまいます。

#この部分までの実行結果例(抜粋)
PNs6U0DrVCr?
OvwYv!zfbDX5
aRAaRRrM7FvB
NGLMnMritTgd
rfjEH4bdJWi!
lPPHQZm8E?RY
9qR5YazqEcLT
MMXyYVkGv9GU


ランダム文字列は何個ほしいのか

head -n 1

折り返しをした段階では、行数が非常に多くなってしまっています。
そのうちの1行目だけを取得することで、ランダム文字列を1つだけ出力することができます。

取得する行数を増やすことで、一度のコマンド実行で複数のランダム文字列を作ることもできます。

#最終的な実行結果例
zkLcT*79xlgK


おまけ

これで、急にアルファベット小文字のみで20文字のランダムな文字列が5つ必要になっても、やみくもにキーボードをたたいて自分のランダム具合を試さなくてよくなりました。

cat /dev/urandom | tr -dc 'a-z' | fold -w 20 | head -n 5
#実行結果
tbqguavkuluqqwvhxkjk
zcokwrizmtrrvhnncwvk
biftikdsalylyimqptma
icvjkdtlaymbohcqvhhs
odaozgilxxzocnxatdbd


この記事が気に入ったらサポートをしてみませんか?