Linuxのシェルスクリプトで処理を自動化する時、初期パスワードをランダムな値でセットしたい場合があります。
このような場合、Linuxで用意されている/dev/urandomを利用すると便利です。
/dev/urandomを利用したコマンドの例
以下のコマンドはbash環境で実行していますが、変数PASSWORDにランダムな10文字の文字列が入っていることが確認できます。
$ PASSWORD=$(more /dev/urandom | tr -d -c '[:alnum:]' | fold -w 10 | head -1)
$ echo ${PASSWORD}
yf3CWBM73i
再度同じコマンドを実行すると異なる値が取得できるので、たしかにランダムな文字列であることが確認できます。
$ PASSWORD=$(more /dev/urandom | tr -d -c '[:alnum:]' | fold -w 10 | head -1)
$ echo ${PASSWORD}
5EnpB2UcFY
ランダムパスワード生成の仕組み
上記の例では複数のコマンドをパイプで繋いでおり少し複雑なので、動作の原理を1つづつ順を追って説明します。
まず、more /dev/urandom
でランダムな値を取得しています。
/dev/urandomはランダムな文字列をバイナリで返すので、tr -d -c '[:alnum:]'
コマンドを通し、制御文字を捨てて英数文字だけを取得します。その後、fold -w 10
で10文字毎に改行を行い、最後にhead -1
で最初の1行のみを取得しています。
最後にコマンド全体を$()で囲いコマンドの実行結果を文字列として取得します。取得した値はPASSWORD変数に代入しています。
スクリプトを改造する
上記の仕組みでパスワードを生成しているため、パイプで実行されている後続コマンドのパラメータを変更することで振る舞いを変更できます。
10文字のパスワードを5個作る
$ more /dev/urandom | tr -d -c '[:alnum:]' | fold -w 10 | head -5
55aQCmeQMV
sG8mUeX6j5
lfUAZwHDei
mLhV6xS7cK
2HvVkxYMCD
16文字のパスワードを作る
more /dev/urandom | tr -d -c '[:alnum:]' | fold -w 16 | head -1
e3DxTtUe6m1O0qnE
数字だけの8桁パスワードを作る
$ more /dev/urandom | tr -d -c '[:digit:]' | fold -w 8 | head -1
66794094
記号も含めた32桁のパスワードを作る
$ more /dev/urandom | tr -d -c '[:graph:]' | fold -w 32 | head -1
73Q?JbX(Tqb&P*7F~6PIrJtIM[\/[?Hy
1~5と#,$,!だけで構成されるパスワードを作る
$ more /dev/urandom | tr -d -c '12345#$!' | fold -w 10 | head -1
5!$13!3##!
上記のような形で、パイプで実行しているコマンドのパラメータを調整して、望んだ生成ルールに合致したパスワードを作ってみてください。
こちらもおススメ