#!/bin/dash
set -u
set -e
fun_main() {
fun_generate_password 16
}
# 指定した長さのパスワードを生成
fun_generate_password() {
local pass_len=$1
local src="$(fun_char_range "!" "~")"
local src_len=${#src}
local pass=""
local i
for i in $(seq ${pass_len}); do
pass="${pass}$(fun_echo "${src}" | cut -c $(fun_get_random 1 ${src_len}))"
done
fun_echo "${pass}"
}
# 指定した範囲の文字を返す
fun_char_range() {
local min=$(fun_asc "$1")
local max=$(fun_asc "$2")
local chars=""
local code
for code in $(seq ${min} ${max}); do
chars="${chars}$(fun_chr ${code})"
done
fun_echo "${chars}"
}
# 指定した範囲の乱数を返す
fun_get_random() {
local min=$1
local max=$2
local range=$((max - min + 1))
local random_count=$((1 << 56))
local cutoff=$((random_count - random_count % range))
local num
while :; do
num=$((0x$(od -A n -N 7 -t x1 /dev/urandom | sed "s/ //g")))
if [ ${num} -lt ${cutoff} ]; then
break
fi
done
fun_echo $((num % range + min))
}
# 文字コードを文字に変換
fun_chr() {
printf "\\$(printf "%o" $1)"
}
# 文字を文字コードに変換
fun_asc() {
printf "%d" "\"$1"
}
fun_echo() {
printf "%s\\n" "$1"
}
fun_main
【関連する記事】