以前のスクリプトを改良です。

スクリプト内容

  • password_generate.rb
# パスワード生成関数
def generate_password(length, complexity, password_count, exclude_similar)
  # 発行強度に応じた文字セットを選択
  base_chars = {
    1 => [('a'..'z'), (0..9)],
    2 => [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*']],
    3 => [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*'], ['-', '_', '=', '+', '<', '>', '?']]
  }

  chars = base_chars[complexity].map(&:to_a).flatten

  # 見た目が似ている文字を除外
  similar_chars = %w[i l 1 I o O 0 |]
  chars -= similar_chars if exclude_similar

  if chars.empty?
    puts "文字セットが空です。条件を入力してください。"
    return
  end

  # 指定された数のパスワードを生成
  password_count.times do |i|
    password = Array.new(length) { chars.sample }.join
    puts "Password #{i + 1}: #{password}"
  end
end

# 発行強度入力関数
def get_complexity
  puts "発行強度を選択してください:\n"
  puts "1: 小文字と数字のみ(例: a1b2c3)- 8文字\n"
  puts "2: 小文字、大文字、数字、基本記号(例: Abc1@3)- 10文字\n"
  puts "3: 小文字、大文字、数字、基本記号、追加記号(例: Ab1@-+?)- 12文字\n"
  print "発行強度を1から3の範囲で入力してください (デフォルトは2): "

  complexity_input = gets.chomp

  complexity = complexity_input.empty? ? 2 : complexity_input.to_i

  until (1..3).cover?(complexity)
    print "有効な範囲で入力してください(1から3): "
    complexity = gets.chomp.to_i
  end

  complexity
end

# パスワード数入力関数
def get_password_count
  print "表示するパスワードの数を入力してください (デフォルトは4): "
  count_input = gets.chomp

  count = count_input.empty? ? 4 : count_input.to_i

  count
end

# 見た目が似ている文字を除外するかの入力関数
def get_exclude_similar_option
  print "見た目が似ている文字 (例: i, l, 1, 0) を除外しますか?(y/N): "
  exclude_input = gets.chomp

  %w[y Y].include?(exclude_input)
end

puts "パスワードを生成します。"
complexity = get_complexity
password_count = get_password_count
exclude_similar = get_exclude_similar_option

# 発行強度に応じたパスワード長を設定
length_by_complexity = { 1 => 8, 2 => 10, 3 => 12 }
password_length = length_by_complexity[complexity]

# パスワードを生成
generate_password(password_length, complexity, password_count, exclude_similar)

実行例

ruby password_generate.rb

パスワードを生成します。
発行強度を選択してください:
1: 小文字と数字のみ(例: a1b2c3)- 8文字
2: 小文字、大文字、数字、基本記号(例: Abc1@3)- 10文字
3: 小文字、大文字、数字、基本記号、追加記号(例: Ab1@-+?)- 12文字
発行強度を1から3の範囲で入力してください (デフォルトは2): 2
表示するパスワードの数を入力してください (デフォルトは4): 3
見た目が似ている文字 (例: i, l, 1, 0) を除外しますか?(y/N): n
Password 1: &o26_yTt/j
Password 2: LWn8byl8lO
Password 3: .7R2B/QVHI

として、対話的かつ柔軟なパスワードの生成が可能になりました。