🌊

[bash] Linuxでランダム文字列を生成

2022/08/07に公開

要約

  • パスワード等で使用するため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

コマンド説明

  1. ランダムな文字列を生成
    cat /dev/urandom
  2. 条件の文字、記号をまとめる
    tr -dc 'a-kmnpr-zABD-HJL-NQRPT0-9#?_!'
  3. 8文字ごとにする
    fold -w 8
  4. 行頭から300文字に絞る
    head -n 300
  5. 先頭に記号の文字列を除く
    grep -v '^[#?_!]'
  6. 条件に合致しているか絞り込み
    grep '[#?_!]' | grep '[A-Z]' | grep '[a-z]' | grep '[0-9]'
  7. 連続する文字を除く
    grep -vE '(.)\1'
  8. 重複行を取り除く、後続コマンドに含まれるためいらない
    uniq
  9. ランダムの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