쉘에서 6자리 OTP 번호를 인쇄하는 방법

쉘에서 6자리 OTP 번호를 인쇄하는 방법

6자리 랜덤 OTP 번호를 생성하는 스크립트를 작성했습니다. 더 적은 코드 줄로 6자리 OTP 번호를 쉽게 얻을 수 있는 방법이 있나요?

내 코드:

#!/bin/bash

dynamic_array=()

for (( i =1 ; i<=5 ; i++))
{
    store_digit=$(shuf -i0-9 -n1) ; dynamic_array+=("$store_digit")
}
str_array_value="${dynamic_array[*]}" ; echo "Output : ${str_array_value// /}" 

답변1

생성하고 싶다면실제확인할 수 없는 임의의 6자리 문자열이 아닌 공유 비밀에서 생성된 OTP 토큰을 사용할 수 있습니다.oathtool.

그렇지 않으면 steeldriver의 의견으로 충분합니다 printf '%06d\n' "$(shuf -i0-999999 -n1)".

답변2

6자리 십진수에는 15자리보다 큰 임의의 숫자가 필요합니다. 여기서는 30자리 임의의 숫자를 사용하겠습니다.

((RND=RANDOM<<15|RANDOM)) ; echo ${RND: -6}

편집: 관점에 대한 몇 가지 테스트입니다...

~# time for i in {0..2000} ;do printf '%06d\n' "$(shuf -i0-999999 -n1)" >/dev/null ;done

real    0m13.814s
user    0m9.573s
sys     0m4.302s

~# time for i in {0..2000} ;do ((RND=RANDOM<<15|RANDOM)) ; echo ${RND: -6} >/dev/null ;done

real    0m0.120s
user    0m0.101s
sys     0m0.019s

답변3

문제는 다음과 같이 재구성될 수 있습니다. "UTF-8 하위 집합: {0,1,2,3,5,6,7,8,9}의 문자를 포함하는 임의의 6자 문자열을 출력합니다."

그 결과는 다음과 같습니다.

cat /dev/urandom | tr -dc 0-9 | head -c 6

관련 정보