bashでランダムなパスワードを生成する

linuxなどでコマンドラインでランダムパスワードを作りたい場合、下記のコマンドを実行する。
出力される文字列は “,.+-!“の文字列と “12345678” を必ず含む。
なお、間違い易い “0,9(数字の0,9)”、”O(英字大文字のO)”、”l,o(英字小文字のl,o)”は除いています。

$ cat /dev/urandom | \
tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ,.+\-\!' | \
fold -w 12 | grep -i [12345678] | grep -i '[,.+\-\!]' | head -n 16
cp,b2yfArrxa
q2JcSttcqJ.+
fpRjcSu,8PNQ
8ej-tk-a7.6T
6I7,UW6XeYDY
EyXxFHg+Dx7!
g1ctyM!qFQtr
Jf+Q4jSkVdAC
J2r8YRzI+ZbY
wq76vyIjQk7!
yK7z+F7i5b6T
DiwN7,Qm+Q,-
8pIP6zTU,3a,
qjf7.!c5Z1hx
.msB5Pq13e1,
Y4zcWNnu,hnP

これで、12ケタのランダム文字列を16個作成する。
先頭に記号が来るのが、気持ち悪い場合は下記のようにする。

$ cat /dev/urandom | \
tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ,.+\-\!' | \
fold -w 12 | grep -i [12345678] | grep -i '[,.+\-\!]' | \
grep -e '^[12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ]' | head -n 16

パスワードを生成するシェルスクリプトは下記の通り。

#!/bin/bash
LEN=$1
CNT=$2

if [ -z ${LEN} ] ; then LEN=12 ; fi
if [ -z ${CNT} ] ; then CNT=16 ; fi

cat /dev/urandom | tr -dc '12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ,.+\-\!' | fold -w ${LEN} | grep -i [12345678] | grep -i '[,.+\-\!]' | grep -e '^[12345678abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ]' | head -n ${CNT}

上記のシェルスクリプトの場合、引数としてパスワードの長さと出力数を与えられる。
引数が無い場合は、12桁のパスワードを16個作成する。