🌊
[bash] Linuxでランダム文字列を生成
要約
- パスワード等で使用するためLinuxでランダムな文字列を生成する
※crieitから移植
条件
- 8文字構成で数字、アルファベット小文字、大文字、記号の使用かつ類似文字を除外する
- 数字 10文字 (0 1 2 3 4 5 6 7 8 9)
- 小文字 23文字 (a b c d e f g h i j k m n p r s t u v w y z)、除外 (l o q)
- 大文字 14文字 (A B D E F G H J L M N Q R T)、除外 (C I K O S U V W X Y Z)
- 記号 4文字 (# ? _ !)
コマンド
cat /dev/urandom | tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!' | fold -w 8 | head -n 300 | grep -v '^[#?_!]' | grep '[#?_!]' | grep '[A-Z]' | grep '[a-z]' | grep '[0-9]' | grep -vE '(.)\1' | uniq | shuf -n 1
- 省略版 (記号と数字のチェックすれば問題なさそう)
cat /dev/urandom | tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!' | fold -w 8 | head -n 300 | grep -v '^[#?_!]' | grep '[#?_!]' | grep '[0-9]' | grep -vE '(.)\1' | shuf -n 1
コマンド説明
- ランダムな文字列を生成
cat /dev/urandom
- 条件の文字、記号をまとめる
tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!'
- 8文字ごとにする
fold -w 8
- 行頭から300文字に絞る
head -n 300
- 先頭に記号の文字列を除く
grep -v '^[#?_!]'
- 条件に合致しているか絞り込み
grep '[#?_!]' | grep '[A-Z]' | grep '[a-z]' | grep '[0-9]'
- 連続する文字を除く
grep -vE '(.)\1'
- 重複行を取り除く、後続コマンドに含まれるためいらない
uniq
- ランダムの1行を出力
shuf -n 1
実行例
$ cat /dev/urandom | tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!' | fold -w 8 | head -n 300 | grep -v '^[#?_!]' | grep '[#?_!]' | grep [0-9] | grep -vE '(.)\1' | shuf -n 1
9eD?8aiG
Discussion